@rhseung/ps-cli 1.2.1 → 1.3.1

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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getProblemDir
4
- } from "./chunk-63CK6URL.js";
4
+ } from "./chunk-CIG2LEJC.js";
5
5
 
6
6
  // src/utils/problem-id.ts
7
7
  import { join } from "path";
@@ -9931,9 +9931,6 @@ function getBojSessionCookie() {
9931
9931
  }
9932
9932
  return config.get("bojSessionCookie");
9933
9933
  }
9934
- function setBojSessionCookie(cookie) {
9935
- config.set("bojSessionCookie", cookie);
9936
- }
9937
9934
  function getDefaultLanguage() {
9938
9935
  const projectConfig = getProjectConfigSync();
9939
9936
  if (projectConfig?.defaultLanguage) {
@@ -9941,15 +9938,9 @@ function getDefaultLanguage() {
9941
9938
  }
9942
9939
  return config.get("defaultLanguage") ?? "python";
9943
9940
  }
9944
- function setDefaultLanguage(language) {
9945
- config.set("defaultLanguage", language);
9946
- }
9947
9941
  function getCodeOpen() {
9948
9942
  return config.get("codeOpen") ?? false;
9949
9943
  }
9950
- function setCodeOpen(open) {
9951
- config.set("codeOpen", open);
9952
- }
9953
9944
  function getEditor() {
9954
9945
  const projectConfig = getProjectConfigSync();
9955
9946
  if (projectConfig?.editor) {
@@ -9957,9 +9948,6 @@ function getEditor() {
9957
9948
  }
9958
9949
  return config.get("editor") ?? "code";
9959
9950
  }
9960
- function setEditor(editor) {
9961
- config.set("editor", editor);
9962
- }
9963
9951
  function getAutoOpenEditor() {
9964
9952
  const projectConfig = getProjectConfigSync();
9965
9953
  if (projectConfig?.autoOpenEditor !== void 0) {
@@ -9967,9 +9955,6 @@ function getAutoOpenEditor() {
9967
9955
  }
9968
9956
  return config.get("autoOpenEditor") ?? false;
9969
9957
  }
9970
- function setAutoOpenEditor(enabled) {
9971
- config.set("autoOpenEditor", enabled);
9972
- }
9973
9958
  function getSolvedAcHandle() {
9974
9959
  const projectConfig = getProjectConfigSync();
9975
9960
  if (projectConfig?.solvedAcHandle) {
@@ -9977,9 +9962,6 @@ function getSolvedAcHandle() {
9977
9962
  }
9978
9963
  return config.get("solvedAcHandle");
9979
9964
  }
9980
- function setSolvedAcHandle(handle) {
9981
- config.set("solvedAcHandle", handle);
9982
- }
9983
9965
  function getProblemDir() {
9984
9966
  const projectConfig = getProjectConfigSync();
9985
9967
  if (projectConfig?.problemDir !== void 0) {
@@ -9987,27 +9969,13 @@ function getProblemDir() {
9987
9969
  }
9988
9970
  return config.get("problemDir") ?? "problems";
9989
9971
  }
9990
- function setProblemDir(dir) {
9991
- config.set("problemDir", dir);
9992
- }
9993
- function clearConfig() {
9994
- config.clear();
9995
- }
9996
9972
 
9997
9973
  export {
9998
9974
  getBojSessionCookie,
9999
- setBojSessionCookie,
10000
9975
  getDefaultLanguage,
10001
- setDefaultLanguage,
10002
9976
  getCodeOpen,
10003
- setCodeOpen,
10004
9977
  getEditor,
10005
- setEditor,
10006
9978
  getAutoOpenEditor,
10007
- setAutoOpenEditor,
10008
9979
  getSolvedAcHandle,
10009
- setSolvedAcHandle,
10010
- getProblemDir,
10011
- setProblemDir,
10012
- clearConfig
9980
+ getProblemDir
10013
9981
  };
@@ -4,63 +4,76 @@ import {
4
4
  getSupportedLanguagesString
5
5
  } from "../chunk-TQXMB7XV.js";
6
6
  import {
7
- clearConfig,
8
7
  getAutoOpenEditor,
9
- getBojSessionCookie,
10
- getCodeOpen,
11
8
  getDefaultLanguage,
12
9
  getEditor,
13
10
  getProblemDir,
14
- getSolvedAcHandle,
15
- setAutoOpenEditor,
16
- setBojSessionCookie,
17
- setCodeOpen,
18
- setDefaultLanguage,
19
- setEditor,
20
- setProblemDir,
21
- setSolvedAcHandle
22
- } from "../chunk-63CK6URL.js";
11
+ getSolvedAcHandle
12
+ } from "../chunk-CIG2LEJC.js";
23
13
  import "../chunk-FYS2JH42.js";
24
14
 
25
15
  // src/commands/config.tsx
16
+ import React from "react";
26
17
  import { render, Text, Box } from "ink";
18
+ import { StatusMessage, Select, TextInput, Alert } from "@inkjs/ui";
19
+ import { readFile, writeFile, unlink } from "fs/promises";
20
+ import { join } from "path";
21
+ import { existsSync } from "fs";
27
22
  import { jsx, jsxs } from "react/jsx-runtime";
23
+ function getProjectConfigPath() {
24
+ return join(process.cwd(), ".ps-cli.json");
25
+ }
26
+ async function readProjectConfig() {
27
+ const configPath = getProjectConfigPath();
28
+ if (!existsSync(configPath)) {
29
+ return null;
30
+ }
31
+ try {
32
+ const content = await readFile(configPath, "utf-8");
33
+ return JSON.parse(content);
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ async function writeProjectConfig(config) {
39
+ const configPath = getProjectConfigPath();
40
+ await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
41
+ }
28
42
  function getConfigHelp() {
29
43
  return `
30
44
  \uC0AC\uC6A9\uBC95:
31
- $ ps config <\uD0A4> [\uAC12]
32
- $ ps config <\uD0A4> --get
33
- $ ps config --list
45
+ $ ps config get [\uD0A4]
46
+ $ ps config set [\uD0A4]
47
+ $ ps config list
34
48
  $ ps config clear
35
49
 
36
50
  \uC124\uBA85:
37
- \uC0AC\uC6A9\uC790 \uC124\uC815\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
38
- \uC124\uC815\uC740 ~/.config/ps-cli/config.json\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4.
51
+ \uD504\uB85C\uC81D\uD2B8 \uC124\uC815 \uD30C\uC77C(.ps-cli.json)\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
52
+ \uC124\uC815\uC740 \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uC758 .ps-cli.json \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4.
53
+
54
+ \uBA85\uB839\uC5B4:
55
+ get [\uD0A4] \uC124\uC815 \uAC12 \uC870\uD68C (\uD0A4 \uC5C6\uC73C\uBA74 \uB300\uD654\uD615 \uC120\uD0DD)
56
+ set [\uD0A4] \uC124\uC815 \uAC12 \uC124\uC815 (\uD0A4 \uC5C6\uC73C\uBA74 \uB300\uD654\uD615 \uC120\uD0DD)
57
+ list \uBAA8\uB4E0 \uC124\uC815 \uC870\uD68C
58
+ clear .ps-cli.json \uD30C\uC77C \uC0AD\uC81C
39
59
 
40
60
  \uC124\uC815 \uD0A4:
41
- boj-session-cookie BOJ \uC138\uC158 \uCFE0\uD0A4
42
61
  default-language \uAE30\uBCF8 \uC5B8\uC5B4 (${getSupportedLanguagesString()})
43
- code-open \uCF54\uB4DC \uACF5\uAC1C \uC5EC\uBD80 (true/false)
44
62
  editor \uC5D0\uB514\uD130 \uBA85\uB839\uC5B4 (\uC608: code, vim, nano)
45
63
  auto-open-editor fetch \uD6C4 \uC790\uB3D9\uC73C\uB85C \uC5D0\uB514\uD130 \uC5F4\uAE30 (true/false)
46
64
  solved-ac-handle Solved.ac \uD578\uB4E4 (stats \uBA85\uB839\uC5B4\uC6A9)
47
65
  problem-dir \uBB38\uC81C \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C (\uAE30\uBCF8\uAC12: problems, "." \uB610\uB294 ""\uB294 \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8)
48
66
 
49
67
  \uC635\uC158:
50
- --get \uC124\uC815 \uAC12 \uC870\uD68C
51
- --list \uBAA8\uB4E0 \uC124\uC815 \uC870\uD68C
52
- clear \uBAA8\uB4E0 \uC124\uC815 \uCD08\uAE30\uD654
53
68
  --help, -h \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
54
69
 
55
70
  \uC608\uC81C:
56
- $ ps config boj-session-cookie "boj_session=xxx"
57
- $ ps config default-language python
58
- $ ps config solved-ac-handle myhandle
59
- $ ps config problem-dir "." # \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \uC9C1\uC811 \uC800\uC7A5
60
- $ ps config problem-dir "problems" # problems \uB514\uB809\uD1A0\uB9AC \uC0AC\uC6A9 (\uAE30\uBCF8\uAC12)
61
- $ ps config problem-dir --get
62
- $ ps config --list
63
- $ ps config clear # \uBAA8\uB4E0 \uC124\uC815 \uCD08\uAE30\uD654
71
+ $ ps config get # \uB300\uD654\uD615\uC73C\uB85C \uD0A4 \uC120\uD0DD \uD6C4 \uAC12 \uC870\uD68C
72
+ $ ps config get default-language # default-language \uAC12 \uC870\uD68C
73
+ $ ps config set # \uB300\uD654\uD615\uC73C\uB85C \uD0A4 \uC120\uD0DD \uD6C4 \uAC12 \uC124\uC815
74
+ $ ps config set editor cursor # editor\uB97C cursor\uB85C \uC124\uC815
75
+ $ ps config list # \uBAA8\uB4E0 \uC124\uC815 \uC870\uD68C
76
+ $ ps config clear # .ps-cli.json \uD30C\uC77C \uC0AD\uC81C
64
77
  `;
65
78
  }
66
79
  var configHelp = getConfigHelp();
@@ -72,48 +85,110 @@ function ConfigCommand({
72
85
  clear,
73
86
  onComplete
74
87
  }) {
88
+ const [config, setConfig] = React.useState(null);
89
+ const [loading, setLoading] = React.useState(true);
90
+ const [cleared, setCleared] = React.useState(false);
91
+ const [saved, setSaved] = React.useState(false);
92
+ React.useEffect(() => {
93
+ async function loadConfig() {
94
+ const projectConfig = await readProjectConfig();
95
+ setConfig(projectConfig);
96
+ setLoading(false);
97
+ }
98
+ void loadConfig();
99
+ }, []);
100
+ React.useEffect(() => {
101
+ if (clear && !cleared) {
102
+ void (async () => {
103
+ const configPath = getProjectConfigPath();
104
+ if (existsSync(configPath)) {
105
+ await unlink(configPath);
106
+ }
107
+ setCleared(true);
108
+ })();
109
+ }
110
+ }, [clear, cleared]);
111
+ React.useEffect(() => {
112
+ if (configKey && value !== void 0 && !saved) {
113
+ void (async () => {
114
+ const currentConfig = await readProjectConfig() ?? {};
115
+ let updatedConfig = { ...currentConfig };
116
+ switch (configKey) {
117
+ case "default-language": {
118
+ const supportedLanguages = getSupportedLanguages();
119
+ if (!supportedLanguages.includes(value)) {
120
+ console.error(
121
+ `\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uC5B8\uC5B4\uC785\uB2C8\uB2E4: ${value}
122
+ \uC9C0\uC6D0 \uC5B8\uC5B4: ${getSupportedLanguagesString()}`
123
+ );
124
+ process.exit(1);
125
+ }
126
+ updatedConfig.defaultLanguage = value;
127
+ break;
128
+ }
129
+ case "editor":
130
+ updatedConfig.editor = value;
131
+ break;
132
+ case "auto-open-editor":
133
+ updatedConfig.autoOpenEditor = value === "true";
134
+ break;
135
+ case "solved-ac-handle":
136
+ updatedConfig.solvedAcHandle = value;
137
+ break;
138
+ case "problem-dir":
139
+ updatedConfig.problemDir = value;
140
+ break;
141
+ default:
142
+ console.error(`\uC54C \uC218 \uC5C6\uB294 \uC124\uC815 \uD0A4: ${configKey}`);
143
+ process.exit(1);
144
+ }
145
+ await writeProjectConfig(updatedConfig);
146
+ setSaved(true);
147
+ })();
148
+ }
149
+ }, [configKey, value, saved]);
150
+ if (loading) {
151
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(StatusMessage, { variant: "info", children: "\uC124\uC815\uC744 \uBD88\uB7EC\uC624\uB294 \uC911..." }) });
152
+ }
75
153
  if (clear) {
76
- clearConfig();
77
- return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { color: "green", children: "\u2713 \uBAA8\uB4E0 \uC124\uC815\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4." }) });
154
+ if (!cleared) {
155
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(StatusMessage, { variant: "info", children: ".ps-cli.json \uD30C\uC77C\uC744 \uC0AD\uC81C\uD558\uB294 \uC911..." }) });
156
+ }
157
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Alert, { variant: "success", children: ".ps-cli.json \uD30C\uC77C\uC774 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4." }) });
78
158
  }
79
159
  if (list) {
80
- const bojCookie = getBojSessionCookie();
81
- const defaultLang = getDefaultLanguage();
82
- const codeOpen = getCodeOpen();
83
- const editor = getEditor();
84
- const autoOpen = getAutoOpenEditor();
85
- const handle = getSolvedAcHandle();
160
+ const defaultLang = config?.defaultLanguage ?? getDefaultLanguage();
161
+ const editor = config?.editor ?? getEditor();
162
+ const autoOpen = config?.autoOpenEditor ?? getAutoOpenEditor();
163
+ const handle = config?.solvedAcHandle ?? getSolvedAcHandle();
164
+ const problemDir = config?.problemDir ?? getProblemDir();
86
165
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
87
- /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { bold: true, children: "\uD604\uC7AC \uC124\uC815:" }) }),
88
- /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
89
- /* @__PURE__ */ jsxs(Text, { children: [
90
- "boj-session-cookie:",
91
- " ",
92
- /* @__PURE__ */ jsx(Text, { color: bojCookie ? "green" : "gray", children: bojCookie ? "\uC124\uC815\uB428" : "\uC124\uC815 \uC548 \uB428" })
93
- ] }),
94
- /* @__PURE__ */ jsxs(Text, { children: [
95
- "default-language: ",
166
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: "cyan", bold: true, children: "\u2699\uFE0F \uD604\uC7AC \uC124\uC815 (.ps-cli.json)" }) }),
167
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
168
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, children: [
169
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "default-language:" }),
170
+ /* @__PURE__ */ jsx(Text, { children: " " }),
96
171
  /* @__PURE__ */ jsx(Text, { bold: true, children: defaultLang })
97
172
  ] }),
98
- /* @__PURE__ */ jsxs(Text, { children: [
99
- "code-open: ",
100
- /* @__PURE__ */ jsx(Text, { bold: true, children: codeOpen ? "true" : "false" })
101
- ] }),
102
- /* @__PURE__ */ jsxs(Text, { children: [
103
- "editor: ",
173
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, children: [
174
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "editor:" }),
175
+ /* @__PURE__ */ jsx(Text, { children: " " }),
104
176
  /* @__PURE__ */ jsx(Text, { bold: true, children: editor })
105
177
  ] }),
106
- /* @__PURE__ */ jsxs(Text, { children: [
107
- "auto-open-editor: ",
108
- /* @__PURE__ */ jsx(Text, { bold: true, children: autoOpen ? "true" : "false" })
178
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, children: [
179
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "auto-open-editor:" }),
180
+ /* @__PURE__ */ jsx(Text, { children: " " }),
181
+ /* @__PURE__ */ jsx(Text, { bold: true, color: autoOpen ? "green" : "gray", children: autoOpen ? "true" : "false" })
109
182
  ] }),
110
- /* @__PURE__ */ jsxs(Text, { children: [
111
- "solved-ac-handle: ",
112
- /* @__PURE__ */ jsx(Text, { bold: true, children: handle || "\uC124\uC815 \uC548 \uB428" })
183
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, children: [
184
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "solved-ac-handle:" }),
185
+ /* @__PURE__ */ jsx(Text, { children: " " }),
186
+ /* @__PURE__ */ jsx(Text, { bold: true, color: handle ? "cyan" : "gray", children: handle || "\uC124\uC815 \uC548 \uB428" })
113
187
  ] }),
114
- /* @__PURE__ */ jsxs(Text, { children: [
115
- "problem-dir: ",
116
- /* @__PURE__ */ jsx(Text, { bold: true, children: getProblemDir() })
188
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 1, children: [
189
+ /* @__PURE__ */ jsx(Text, { color: "gray", children: "problem-dir:" }),
190
+ /* @__PURE__ */ jsx(Text, { children: " " }),
191
+ /* @__PURE__ */ jsx(Text, { bold: true, children: problemDir })
117
192
  ] })
118
193
  ] })
119
194
  ] });
@@ -121,74 +196,42 @@ function ConfigCommand({
121
196
  if (get && configKey) {
122
197
  let configValue;
123
198
  switch (configKey) {
124
- case "boj-session-cookie":
125
- configValue = getBojSessionCookie();
126
- break;
127
199
  case "default-language":
128
- configValue = getDefaultLanguage();
129
- break;
130
- case "code-open":
131
- configValue = getCodeOpen() ? "true" : "false";
200
+ configValue = config?.defaultLanguage ?? getDefaultLanguage();
132
201
  break;
133
202
  case "editor":
134
- configValue = getEditor();
203
+ configValue = config?.editor ?? getEditor();
135
204
  break;
136
205
  case "auto-open-editor":
137
- configValue = getAutoOpenEditor() ? "true" : "false";
206
+ configValue = config?.autoOpenEditor !== void 0 ? String(config.autoOpenEditor) : String(getAutoOpenEditor());
138
207
  break;
139
208
  case "solved-ac-handle":
140
- configValue = getSolvedAcHandle();
209
+ configValue = config?.solvedAcHandle ?? getSolvedAcHandle();
141
210
  break;
142
211
  case "problem-dir":
143
- configValue = getProblemDir();
212
+ configValue = config?.problemDir ?? getProblemDir();
144
213
  break;
145
214
  default:
146
215
  console.error(`\uC54C \uC218 \uC5C6\uB294 \uC124\uC815 \uD0A4: ${configKey}`);
147
216
  process.exit(1);
148
217
  }
149
- return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { children: configValue || "(\uC124\uC815 \uC548 \uB428)" }) });
218
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: /* @__PURE__ */ jsxs(Box, { children: [
219
+ /* @__PURE__ */ jsxs(Text, { color: "gray", children: [
220
+ configKey,
221
+ ":"
222
+ ] }),
223
+ /* @__PURE__ */ jsx(Text, { children: " " }),
224
+ /* @__PURE__ */ jsx(Text, { bold: true, color: configValue ? "cyan" : "gray", children: configValue || "(\uC124\uC815 \uC548 \uB428)" })
225
+ ] }) });
150
226
  }
151
227
  if (configKey && value !== void 0) {
152
- switch (configKey) {
153
- case "boj-session-cookie":
154
- setBojSessionCookie(value);
155
- break;
156
- case "default-language":
157
- const supportedLanguages = getSupportedLanguages();
158
- if (!supportedLanguages.includes(value)) {
159
- console.error(
160
- `\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uC5B8\uC5B4\uC785\uB2C8\uB2E4: ${value}
161
- \uC9C0\uC6D0 \uC5B8\uC5B4: ${getSupportedLanguagesString()}`
162
- );
163
- process.exit(1);
164
- }
165
- setDefaultLanguage(value);
166
- break;
167
- case "code-open":
168
- setCodeOpen(value === "true");
169
- break;
170
- case "editor":
171
- setEditor(value);
172
- break;
173
- case "auto-open-editor":
174
- setAutoOpenEditor(value === "true");
175
- break;
176
- case "solved-ac-handle":
177
- setSolvedAcHandle(value);
178
- break;
179
- case "problem-dir":
180
- setProblemDir(value);
181
- break;
182
- default:
183
- console.error(`\uC54C \uC218 \uC5C6\uB294 \uC124\uC815 \uD0A4: ${configKey}`);
184
- process.exit(1);
228
+ if (!saved) {
229
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(StatusMessage, { variant: "info", children: "\uC124\uC815\uC744 \uC800\uC7A5\uD558\uB294 \uC911..." }) });
185
230
  }
186
- return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Text, { color: "green", children: [
187
- "\u2713 \uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ",
188
- configKey,
189
- " = ",
190
- value
191
- ] }) });
231
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
232
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Alert, { variant: "success", children: "\uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4" }) }),
233
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { bold: true, children: value }) })
234
+ ] });
192
235
  }
193
236
  return null;
194
237
  }
@@ -216,39 +259,189 @@ async function configCommand(configKey, value, get, list, clear) {
216
259
  }, 100);
217
260
  });
218
261
  }
262
+ var CONFIG_KEYS = [
263
+ { label: "default-language", value: "default-language" },
264
+ { label: "editor", value: "editor" },
265
+ { label: "auto-open-editor", value: "auto-open-editor" },
266
+ { label: "solved-ac-handle", value: "solved-ac-handle" },
267
+ { label: "problem-dir", value: "problem-dir" }
268
+ ];
269
+ function ConfigKeySelector({ onSelect }) {
270
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
271
+ /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: "cyan", bold: true, children: "\u2699\uFE0F \uC124\uC815 \uAD00\uB9AC" }) }),
272
+ /* @__PURE__ */ jsx(Alert, { variant: "info", children: "\uC124\uC815 \uD0A4\uB97C \uC120\uD0DD\uD558\uC138\uC694" }),
273
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(
274
+ Select,
275
+ {
276
+ options: CONFIG_KEYS,
277
+ onChange: (value) => {
278
+ onSelect(value);
279
+ }
280
+ }
281
+ ) })
282
+ ] });
283
+ }
284
+ async function selectConfigKey() {
285
+ return new Promise((resolve) => {
286
+ const { unmount } = render(
287
+ /* @__PURE__ */ jsx(
288
+ ConfigKeySelector,
289
+ {
290
+ onSelect: (key) => {
291
+ unmount();
292
+ resolve(key);
293
+ }
294
+ }
295
+ )
296
+ );
297
+ });
298
+ }
299
+ function ConfigValueInput({
300
+ configKey,
301
+ onSubmit
302
+ }) {
303
+ const getPlaceholder = () => {
304
+ switch (configKey) {
305
+ case "default-language":
306
+ return `\uC5B8\uC5B4 \uC785\uB825 (${getSupportedLanguagesString()})`;
307
+ case "editor":
308
+ return "\uC5D0\uB514\uD130 \uBA85\uB839\uC5B4 \uC785\uB825";
309
+ case "auto-open-editor":
310
+ return "true \uB610\uB294 false \uC785\uB825";
311
+ case "solved-ac-handle":
312
+ return "Solved.ac \uD578\uB4E4 \uC785\uB825";
313
+ case "problem-dir":
314
+ return "\uBB38\uC81C \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C \uC785\uB825";
315
+ default:
316
+ return "\uAC12 \uC785\uB825";
317
+ }
318
+ };
319
+ const getDescription = () => {
320
+ switch (configKey) {
321
+ case "default-language":
322
+ return `\uC9C0\uC6D0 \uC5B8\uC5B4: ${getSupportedLanguagesString()}`;
323
+ case "editor":
324
+ return "\uC608: code, cursor, vim, nano";
325
+ case "auto-open-editor":
326
+ return "fetch \uD6C4 \uC790\uB3D9\uC73C\uB85C \uC5D0\uB514\uD130\uB97C \uC5F4\uC9C0 \uC5EC\uBD80";
327
+ case "solved-ac-handle":
328
+ return "Solved.ac \uC0AC\uC6A9\uC790 \uD578\uB4E4";
329
+ case "problem-dir":
330
+ return '\uBB38\uC81C \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C (\uAE30\uBCF8\uAC12: "problems", \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8: ".")';
331
+ default:
332
+ return "";
333
+ }
334
+ };
335
+ const getSuggestions = () => {
336
+ switch (configKey) {
337
+ case "default-language":
338
+ return getSupportedLanguages();
339
+ case "editor":
340
+ return ["code", "cursor", "vim", "nano"];
341
+ case "auto-open-editor":
342
+ return ["true", "false"];
343
+ case "problem-dir":
344
+ return ["problems", ".", ""];
345
+ default:
346
+ return [];
347
+ }
348
+ };
349
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
350
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Alert, { variant: "info", children: "\uAC12\uC744 \uC785\uB825\uD558\uC138\uC694" }) }),
351
+ getDescription() && /* @__PURE__ */ jsx(Box, { marginTop: 1, marginBottom: 0, children: /* @__PURE__ */ jsx(Text, { color: "gray", dimColor: true, children: getDescription() }) }),
352
+ /* @__PURE__ */ jsx(Box, { marginTop: 0, children: /* @__PURE__ */ jsx(
353
+ TextInput,
354
+ {
355
+ placeholder: getPlaceholder(),
356
+ suggestions: getSuggestions(),
357
+ onSubmit: (value) => {
358
+ onSubmit(value);
359
+ }
360
+ }
361
+ ) })
362
+ ] });
363
+ }
364
+ async function inputConfigValue(configKey) {
365
+ return new Promise((resolve) => {
366
+ const { unmount } = render(
367
+ /* @__PURE__ */ jsx(
368
+ ConfigValueInput,
369
+ {
370
+ configKey,
371
+ onSubmit: (value) => {
372
+ unmount();
373
+ resolve(value);
374
+ }
375
+ }
376
+ )
377
+ );
378
+ });
379
+ }
219
380
  async function configExecute(args, flags) {
220
381
  if (flags.help) {
221
382
  console.log(getConfigHelp().trim());
222
383
  process.exit(0);
223
384
  return;
224
385
  }
225
- if (args[0] === "clear") {
386
+ const command = args[0];
387
+ if (command === "clear") {
226
388
  await configCommand(void 0, void 0, false, false, true);
227
389
  return;
228
390
  }
229
- if (flags.list) {
391
+ if (command === "list" || flags.list) {
230
392
  await configCommand(void 0, void 0, false, true);
231
393
  return;
232
394
  }
233
- const key = args[0];
234
- const value = args[1];
235
- if (!key) {
236
- console.error("\uC624\uB958: \uC124\uC815 \uD0A4\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.");
237
- console.error(`\uC0AC\uC6A9\uBC95: ps config <\uD0A4> [\uAC12]`);
238
- console.error(`\uC0AC\uC6A9\uBC95: ps config clear`);
239
- console.error(`\uB3C4\uC6C0\uB9D0: ps config --help`);
240
- process.exit(1);
395
+ if (command === "get") {
396
+ const key = args[1];
397
+ if (key) {
398
+ await configCommand(key, void 0, true, false);
399
+ } else {
400
+ const selectedKey = await selectConfigKey();
401
+ if (!selectedKey) {
402
+ process.exit(0);
403
+ return;
404
+ }
405
+ await configCommand(selectedKey, void 0, true, false);
406
+ }
407
+ return;
408
+ }
409
+ if (command === "set") {
410
+ const key = args[1];
411
+ if (key) {
412
+ const inputValue = await inputConfigValue(key);
413
+ if (!inputValue) {
414
+ process.exit(0);
415
+ return;
416
+ }
417
+ await configCommand(key, inputValue, false, false);
418
+ } else {
419
+ const selectedKey = await selectConfigKey();
420
+ if (!selectedKey) {
421
+ process.exit(0);
422
+ return;
423
+ }
424
+ const inputValue = await inputConfigValue(selectedKey);
425
+ if (!inputValue) {
426
+ process.exit(0);
427
+ return;
428
+ }
429
+ await configCommand(selectedKey, inputValue, false, false);
430
+ }
431
+ return;
241
432
  }
242
- if (flags.get) {
243
- await configCommand(key, void 0, true, false);
244
- } else if (value !== void 0) {
245
- await configCommand(key, value, false, false);
246
- } else {
247
- console.error("\uC624\uB958: \uC124\uC815 \uAC12\uC744 \uC785\uB825\uD558\uAC70\uB098 --get \uC635\uC158\uC744 \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694.");
248
- console.error(`\uC0AC\uC6A9\uBC95: ps config <\uD0A4> <\uAC12>`);
249
- console.error(`\uC0AC\uC6A9\uBC95: ps config <\uD0A4> --get`);
433
+ if (!command) {
434
+ console.error("\uC624\uB958: \uBA85\uB839\uC5B4\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.");
435
+ console.error("\uC0AC\uC6A9\uBC95: ps config <\uBA85\uB839\uC5B4>");
436
+ console.error("\uBA85\uB839\uC5B4: get, set, list, clear");
437
+ console.error("\uB3C4\uC6C0\uB9D0: ps config --help");
250
438
  process.exit(1);
439
+ return;
251
440
  }
441
+ console.error(`\uC624\uB958: \uC54C \uC218 \uC5C6\uB294 \uBA85\uB839\uC5B4: ${command}`);
442
+ console.error("\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBA85\uB839\uC5B4: get, set, list, clear");
443
+ console.error("\uB3C4\uC6C0\uB9D0: ps config --help");
444
+ process.exit(1);
252
445
  }
253
446
  var configCommandDef = {
254
447
  name: "config",