star8-cli 1.0.2 → 1.1.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/README.md CHANGED
@@ -23,7 +23,8 @@ star8 --help
23
23
 
24
24
  ## ドキュメント
25
25
 
26
- - [スターアカウント CLI リファレンス](https://developer.star.ne.jp/cli/server/)
26
+ - [Star8アカウント CLI リファレンス](https://developer.star.ne.jp/cli/server/)
27
+ - [更新履歴](https://developer.star.ne.jp/changelog/)
27
28
 
28
29
  ## ライセンス
29
30
 
package/dist/index.js CHANGED
@@ -111,6 +111,81 @@ var ApiClient = class {
111
111
  return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);
112
112
  }
113
113
  // ================================================================
114
+ // 迷惑メールフィルタ設定
115
+ // ================================================================
116
+ async listSpamFilter(params) {
117
+ return this.get(`${this.serverPath()}/spam-filter`, params);
118
+ }
119
+ async updateSpamFilter(domain, data) {
120
+ return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}`, data);
121
+ }
122
+ async updateSpamFilterDmarcReceiver(domain, data) {
123
+ return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}/dmarc-receiver`, data);
124
+ }
125
+ // ================================================================
126
+ // 自動応答設定
127
+ // ================================================================
128
+ async listAutoReply(params) {
129
+ return this.get(`${this.serverPath()}/auto-reply`, params);
130
+ }
131
+ async getAutoReply(mailAddress) {
132
+ return this.get(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);
133
+ }
134
+ async addAutoReply(data) {
135
+ return this.post(`${this.serverPath()}/auto-reply`, data);
136
+ }
137
+ async updateAutoReply(mailAddress, data) {
138
+ return this.put(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`, data);
139
+ }
140
+ async deleteAutoReply(mailAddress) {
141
+ return this.delete(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);
142
+ }
143
+ // ================================================================
144
+ // SMTP認証国外アクセス制限
145
+ // ================================================================
146
+ async listSmtpAbroadRestriction(params) {
147
+ return this.get(`${this.serverPath()}/smtp-abroad-restriction`, params);
148
+ }
149
+ async updateSmtpAbroadRestriction(domain, data) {
150
+ return this.put(`${this.serverPath()}/smtp-abroad-restriction/${enc(domain)}`, data);
151
+ }
152
+ // ================================================================
153
+ // DKIM設定
154
+ // ================================================================
155
+ async listDkim(params) {
156
+ return this.get(`${this.serverPath()}/dkim`, params);
157
+ }
158
+ async getDkim(fqdn) {
159
+ return this.get(`${this.serverPath()}/dkim/${enc(fqdn)}`);
160
+ }
161
+ async updateDkim(fqdn, data) {
162
+ return this.put(`${this.serverPath()}/dkim/${enc(fqdn)}`, data);
163
+ }
164
+ // ================================================================
165
+ // SPF設定
166
+ // ================================================================
167
+ async listSpf(params) {
168
+ return this.get(`${this.serverPath()}/spf`, params);
169
+ }
170
+ async addSpf(data) {
171
+ return this.post(`${this.serverPath()}/spf`, data);
172
+ }
173
+ async updateSpf(fqdn, data) {
174
+ return this.put(`${this.serverPath()}/spf/${enc(fqdn)}`, data);
175
+ }
176
+ async deleteSpf(fqdn) {
177
+ return this.delete(`${this.serverPath()}/spf/${enc(fqdn)}`);
178
+ }
179
+ // ================================================================
180
+ // DMARC設定(送信側)
181
+ // ================================================================
182
+ async listDmarc(params) {
183
+ return this.get(`${this.serverPath()}/dmarc`, params);
184
+ }
185
+ async updateDmarc(domain, data) {
186
+ return this.put(`${this.serverPath()}/dmarc/${enc(domain)}`, data);
187
+ }
188
+ // ================================================================
114
189
  // FTP
115
190
  // ================================================================
116
191
  async listFtp(params) {
@@ -814,6 +889,54 @@ function registerMailCommands(parent, brand) {
814
889
  });
815
890
  }
816
891
 
892
+ // ../core/dist/commands/server/spam-filter/index.js
893
+ function parseAddressList(value) {
894
+ if (value === "") {
895
+ return [];
896
+ }
897
+ return value.split(",").map((a) => a.trim()).filter((a) => a !== "");
898
+ }
899
+ function registerSpamFilterCommands(parent, brand) {
900
+ const spamFilter = parent.command("spam-filter").description("\u8FF7\u60D1\u30E1\u30FC\u30EB\u30D5\u30A3\u30EB\u30BF\u8A2D\u5B9A");
901
+ spamFilter.command("list").description("\u8FF7\u60D1\u30E1\u30FC\u30EB\u30D5\u30A3\u30EB\u30BF\u8A2D\u5B9A\u3092\u53D6\u5F97").option("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
902
+ const client = resolveClient(parent, brand);
903
+ const params = {};
904
+ if (opts.domain)
905
+ params.domain = opts.domain;
906
+ printResult(await client.listSpamFilter(params), getFormat(parent));
907
+ });
908
+ spamFilter.command("update <domain>").description("\u8FF7\u60D1\u30E1\u30FC\u30EB\u30D5\u30A3\u30EB\u30BF\u8A2D\u5B9A\u3092\u66F4\u65B0\uFF08\u6307\u5B9A\u3057\u305F\u9805\u76EE\u306E\u307F\uFF09").option("--filter-type <value>", "\u8FF7\u60D1\u30E1\u30FC\u30EB\u30D5\u30A3\u30EB\u30BF\uFF08off / standard / cloudmark_authority\uFF09").option("--detection-action <action>", "\u691C\u77E5\u6642\u306E\u51E6\u7406\uFF08inbox / spam / trash / delete\uFF09").option("--white-list <addresses>", "\u30DB\u30EF\u30A4\u30C8\u30EA\u30B9\u30C8\uFF08\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3002\u7A7A\u6587\u5B57\u3067\u30AF\u30EA\u30A2\uFF09").option("--black-list <addresses>", "\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\uFF08\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3002\u7A7A\u6587\u5B57\u3067\u30AF\u30EA\u30A2\uFF09").option("--spam-level <level>", "\u6A19\u6E96\u30B9\u30D1\u30E0\u30D5\u30A3\u30EB\u30BF\u5224\u5B9A\u57FA\u6E96\uFF08very_lenient / lenient / normal / strict / very_strict / strictest\uFF09").option("--strict-non-japanese-subject <value>", "\u65E5\u672C\u8A9E\u3092\u542B\u307E\u306A\u3044\u4EF6\u540D\u306B\u5BFE\u3057\u3066\u5224\u5B9A\u3092\u53B3\u3057\u304F\u3059\u308B\uFF08true/false\uFF09").option("--strict-html-mail <value>", "HTML\u30E1\u30FC\u30EB\u306B\u5BFE\u3057\u3066\u5224\u5B9A\u3092\u53B3\u3057\u304F\u3059\u308B\uFF08true/false\uFF09").action(async (domain, opts) => {
909
+ const data = {};
910
+ if (opts.filterType !== void 0)
911
+ data.filter_type = opts.filterType;
912
+ if (opts.detectionAction !== void 0)
913
+ data.detection_action = opts.detectionAction;
914
+ if (opts.whiteList !== void 0)
915
+ data.white_list = parseAddressList(opts.whiteList);
916
+ if (opts.blackList !== void 0)
917
+ data.black_list = parseAddressList(opts.blackList);
918
+ if (opts.spamLevel !== void 0)
919
+ data.spam_level = opts.spamLevel;
920
+ if (opts.strictNonJapaneseSubject !== void 0) {
921
+ data.strict_non_japanese_subject = opts.strictNonJapaneseSubject;
922
+ }
923
+ if (opts.strictHtmlMail !== void 0) {
924
+ data.strict_html_mail = opts.strictHtmlMail;
925
+ }
926
+ if (Object.keys(data).length === 0) {
927
+ throw new Error("\u66F4\u65B0\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044");
928
+ }
929
+ const client = resolveClient(parent, brand);
930
+ printResult(await client.updateSpamFilter(domain, data), getFormat(parent));
931
+ });
932
+ spamFilter.command("dmarc-receiver-update <domain>").description("\u53D7\u4FE1\u5074DMARC\u8A2D\u5B9A\u3092\u66F4\u65B0").requiredOption("--dmarc-receiver <value>", "\u53D7\u4FE1\u5074DMARC\u8A2D\u5B9A\uFF08true/false\uFF09").action(async (domain, opts) => {
933
+ const client = resolveClient(parent, brand);
934
+ printResult(await client.updateSpamFilterDmarcReceiver(domain, {
935
+ dmarc_receiver: opts.dmarcReceiver
936
+ }), getFormat(parent));
937
+ });
938
+ }
939
+
817
940
  // ../core/dist/commands/server/mail-filter/index.js
818
941
  function registerMailFilterCommands(parent, brand) {
819
942
  const mailFilter = parent.command("mail-filter").description("\u30E1\u30FC\u30EB\u632F\u308A\u5206\u3051\u8A2D\u5B9A");
@@ -848,6 +971,155 @@ function registerMailFilterCommands(parent, brand) {
848
971
  });
849
972
  }
850
973
 
974
+ // ../core/dist/commands/server/auto-reply/index.js
975
+ function registerAutoReplyCommands(parent, brand) {
976
+ const autoReply = parent.command("auto-reply").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A");
977
+ autoReply.command("list").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A\u306E\u4E00\u89A7\u3092\u53D6\u5F97").option("--domain <domain>", "\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
978
+ const client = resolveClient(parent, brand);
979
+ const params = {};
980
+ if (opts.domain)
981
+ params.domain = opts.domain;
982
+ printResult(await client.listAutoReply(params), getFormat(parent));
983
+ });
984
+ autoReply.command("get <mailAddress>").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A\u306E\u8A73\u7D30\u3092\u53D6\u5F97").action(async (mailAccount) => {
985
+ const client = resolveClient(parent, brand);
986
+ printResult(await client.getAutoReply(mailAccount), getFormat(parent));
987
+ });
988
+ autoReply.command("add").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A\u3092\u8FFD\u52A0").requiredOption("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3").requiredOption("--mail-address <address>", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9").requiredOption("--from-name <name>", "\u9001\u4FE1\u8005\u540D").requiredOption("--subject <subject>", "\u4EF6\u540D").requiredOption("--body <body>", "\u672C\u6587").requiredOption("--quote-incoming <value>", "\u53D7\u4FE1\u30E1\u30FC\u30EB\u306E\u5F15\u7528\uFF08true/false \u307E\u305F\u306F 1/0\uFF09").action(async (opts) => {
989
+ const client = resolveClient(parent, brand);
990
+ printResult(await client.addAutoReply({
991
+ domain: opts.domain,
992
+ mail_address: opts.mailAddress,
993
+ from_name: opts.fromName,
994
+ subject: opts.subject,
995
+ body: opts.body,
996
+ quote_incoming: opts.quoteIncoming
997
+ }), getFormat(parent));
998
+ });
999
+ autoReply.command("update <mailAddress>").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A\u3092\u66F4\u65B0\uFF08\u6307\u5B9A\u3057\u305F\u9805\u76EE\u306E\u307F\uFF09").option("--from-name <name>", "\u9001\u4FE1\u8005\u540D").option("--subject <subject>", "\u4EF6\u540D").option("--body <body>", "\u672C\u6587").option("--quote-incoming <value>", "\u53D7\u4FE1\u30E1\u30FC\u30EB\u306E\u5F15\u7528\uFF08true/false \u307E\u305F\u306F 1/0\uFF09").action(async (mailAccount, opts) => {
1000
+ const data = {};
1001
+ if (opts.fromName !== void 0)
1002
+ data.from_name = opts.fromName;
1003
+ if (opts.subject !== void 0)
1004
+ data.subject = opts.subject;
1005
+ if (opts.body !== void 0)
1006
+ data.body = opts.body;
1007
+ if (opts.quoteIncoming !== void 0) {
1008
+ data.quote_incoming = opts.quoteIncoming;
1009
+ }
1010
+ if (Object.keys(data).length === 0) {
1011
+ throw new Error("\u66F4\u65B0\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08--from-name / --subject / --body / --quote-incoming\uFF09");
1012
+ }
1013
+ const client = resolveClient(parent, brand);
1014
+ printResult(await client.updateAutoReply(mailAccount, data), getFormat(parent));
1015
+ });
1016
+ autoReply.command("delete <mailAddress>").description("\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A\u3092\u524A\u9664").option("-y, --yes", "\u78BA\u8A8D\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u30B9\u30AD\u30C3\u30D7").action(async (mailAccount) => {
1017
+ await confirmDestructiveAction(parent, `\u81EA\u52D5\u5FDC\u7B54\u8A2D\u5B9A "${mailAccount}" \u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F`);
1018
+ const client = resolveClient(parent, brand);
1019
+ printResult(await client.deleteAutoReply(mailAccount), getFormat(parent));
1020
+ });
1021
+ }
1022
+
1023
+ // ../core/dist/commands/server/smtp-abroad-restriction/index.js
1024
+ function registerSmtpAbroadRestrictionCommands(parent, brand) {
1025
+ const smtpAbroadRestriction = parent.command("smtp-abroad-restriction").description("SMTP\u8A8D\u8A3C\u306E\u56FD\u5916\u30A2\u30AF\u30BB\u30B9\u5236\u9650\u8A2D\u5B9A");
1026
+ smtpAbroadRestriction.command("list").description("SMTP\u8A8D\u8A3C\u306E\u56FD\u5916\u30A2\u30AF\u30BB\u30B9\u5236\u9650\u8A2D\u5B9A\u3092\u53D6\u5F97").option("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
1027
+ const client = resolveClient(parent, brand);
1028
+ const params = {};
1029
+ if (opts.domain)
1030
+ params.domain = opts.domain;
1031
+ printResult(await client.listSmtpAbroadRestriction(params), getFormat(parent));
1032
+ });
1033
+ smtpAbroadRestriction.command("update <domain>").description("SMTP\u8A8D\u8A3C\u306E\u56FD\u5916\u30A2\u30AF\u30BB\u30B9\u5236\u9650\u8A2D\u5B9A\u3092\u66F4\u65B0").requiredOption("--abroad-access-restriction <value>", "\u56FD\u5916\u30A2\u30AF\u30BB\u30B9\u5236\u9650\u306E\u6709\u52B9/\u7121\u52B9\uFF08true/false \u307E\u305F\u306F 1/0\uFF09").action(async (domain, opts) => {
1034
+ const client = resolveClient(parent, brand);
1035
+ printResult(await client.updateSmtpAbroadRestriction(domain, {
1036
+ abroad_access_restriction: opts.abroadAccessRestriction
1037
+ }), getFormat(parent));
1038
+ });
1039
+ }
1040
+
1041
+ // ../core/dist/commands/server/dkim/index.js
1042
+ function registerDkimCommands(parent, brand) {
1043
+ const dkim = parent.command("dkim").description("DKIM\u8A2D\u5B9A");
1044
+ dkim.command("list").description("DKIM\u8A2D\u5B9A\u4E00\u89A7\u3092\u53D6\u5F97").option("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
1045
+ const client = resolveClient(parent, brand);
1046
+ const params = {};
1047
+ if (opts.domain)
1048
+ params.domain = opts.domain;
1049
+ printResult(await client.listDkim(params), getFormat(parent));
1050
+ });
1051
+ dkim.command("get <fqdn>").description("DKIM\u8A2D\u5B9A\u306E\u8A73\u7D30\u3092\u53D6\u5F97").action(async (fqdn) => {
1052
+ const client = resolveClient(parent, brand);
1053
+ printResult(await client.getDkim(fqdn), getFormat(parent));
1054
+ });
1055
+ dkim.command("update <fqdn>").description("DKIM\u8A2D\u5B9A\u306E\u6709\u52B9/\u7121\u52B9\u3092\u5207\u308A\u66FF\u3048").requiredOption("--enabled <value>", "DKIM\u306E\u6709\u52B9/\u7121\u52B9\uFF08true/false \u307E\u305F\u306F 1/0\uFF09").action(async (fqdn, opts) => {
1056
+ const client = resolveClient(parent, brand);
1057
+ printResult(await client.updateDkim(fqdn, { enabled: opts.enabled }), getFormat(parent));
1058
+ });
1059
+ }
1060
+
1061
+ // ../core/dist/commands/server/dmarc/index.js
1062
+ function parseNotificationMailAddresses(value) {
1063
+ if (value === "") {
1064
+ return [];
1065
+ }
1066
+ return value.split(",").map((address) => address.trim()).filter((address) => address !== "");
1067
+ }
1068
+ function registerDmarcCommands(parent, brand) {
1069
+ const dmarc = parent.command("dmarc").description("\u9001\u4FE1\u5074DMARC\u8A2D\u5B9A");
1070
+ dmarc.command("list").description("\u9001\u4FE1\u5074DMARC\u8A2D\u5B9A\u3092\u53D6\u5F97").option("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
1071
+ const client = resolveClient(parent, brand);
1072
+ const params = {};
1073
+ if (opts.domain)
1074
+ params.domain = opts.domain;
1075
+ printResult(await client.listDmarc(params), getFormat(parent));
1076
+ });
1077
+ dmarc.command("update <domain>").description("\u9001\u4FE1\u5074DMARC\u8A2D\u5B9A\u3092\u66F4\u65B0\uFF08\u6307\u5B9A\u3057\u305F\u9805\u76EE\u306E\u307F\uFF09").option("--policy <policy>", "DMARC\u30DD\u30EA\u30B7\u30FC\uFF08none / quarantine / reject\uFF09").option("--report-enabled <value>", "\u30EC\u30DD\u30FC\u30C8\u901A\u77E5\u306E\u6709\u52B9/\u7121\u52B9\uFF08true/false \u307E\u305F\u306F 1/0\uFF09\u3002false \u306E\u3068\u304D\u901A\u77E5\u5148\u306F\u81EA\u52D5\u7684\u306B\u7A7A\u306B\u306A\u308B").option("--notification-mail-addresses <addresses>", "\u30EC\u30DD\u30FC\u30C8\u901A\u77E5\u5148\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\uFF08\u30AB\u30F3\u30DE\u533A\u5207\u308A\uFF09\u3002--report-enabled true \u306E\u3068\u304D\u306F1\u4EF6\u4EE5\u4E0A\u5FC5\u9808").action(async (domain, opts) => {
1078
+ const data = {};
1079
+ if (opts.policy !== void 0)
1080
+ data.policy = opts.policy;
1081
+ if (opts.reportEnabled !== void 0) {
1082
+ data.report_enabled = opts.reportEnabled;
1083
+ }
1084
+ if (opts.notificationMailAddresses !== void 0) {
1085
+ data.notification_mail_addresses = parseNotificationMailAddresses(opts.notificationMailAddresses);
1086
+ }
1087
+ if (Object.keys(data).length === 0) {
1088
+ throw new Error("\u66F4\u65B0\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044");
1089
+ }
1090
+ const client = resolveClient(parent, brand);
1091
+ printResult(await client.updateDmarc(domain, data), getFormat(parent));
1092
+ });
1093
+ }
1094
+
1095
+ // ../core/dist/commands/server/spf/index.js
1096
+ var UPDATE_ACTIONS = ["reset", "enable_gmail", "custom"];
1097
+ function registerSpfCommands(parent, brand) {
1098
+ const spf = parent.command("spf").description("SPF\u8A2D\u5B9A");
1099
+ spf.command("list").description("SPF\u8A2D\u5B9A\u4E00\u89A7\u3092\u53D6\u5F97").option("--domain <domain>", "\u5BFE\u8C61\u30C9\u30E1\u30A4\u30F3\u3067\u7D5E\u308A\u8FBC\u307F").action(async (opts) => {
1100
+ const client = resolveClient(parent, brand);
1101
+ const params = {};
1102
+ if (opts.domain)
1103
+ params.domain = opts.domain;
1104
+ printResult(await client.listSpf(params), getFormat(parent));
1105
+ });
1106
+ spf.command("add").description("SPF\u8A2D\u5B9A\u3092\u8FFD\u52A0").requiredOption("--fqdn <fqdn>", "FQDN\uFF08example.com \u307E\u305F\u306F sub.example.com\uFF09").action(async (opts) => {
1107
+ const client = resolveClient(parent, brand);
1108
+ printResult(await client.addSpf({ fqdn: opts.fqdn }), getFormat(parent));
1109
+ });
1110
+ spf.command("update <fqdn>").description("SPF\u8A2D\u5B9A\u3092\u66F4\u65B0\uFF08reset / enable_gmail / custom\uFF09").requiredOption("--action <action>", `\u64CD\u4F5C\u7A2E\u5225\uFF08${UPDATE_ACTIONS.join(" / ")}\uFF09`).option("--spf-record <record>", "\u30AB\u30B9\u30BF\u30E0SPF\u30EC\u30B3\u30FC\u30C9\uFF08action=custom \u306E\u3068\u304D\u5FC5\u9808\uFF09").action(async (fqdn, opts) => {
1111
+ const body = { action: opts.action };
1112
+ if (opts.spfRecord !== void 0)
1113
+ body.spf_record = opts.spfRecord;
1114
+ const client = resolveClient(parent, brand);
1115
+ printResult(await client.updateSpf(fqdn, body), getFormat(parent));
1116
+ });
1117
+ spf.command("delete <fqdn>").description("SPF\u8A2D\u5B9A\u3092\u524A\u9664").action(async (fqdn) => {
1118
+ const client = resolveClient(parent, brand);
1119
+ printResult(await client.deleteSpf(fqdn), getFormat(parent));
1120
+ });
1121
+ }
1122
+
851
1123
  // ../core/dist/commands/server/ftp/index.js
852
1124
  function registerFtpCommands(parent, brand) {
853
1125
  const ftp = parent.command("ftp").description("FTP\u30A2\u30AB\u30A6\u30F3\u30C8\u8A2D\u5B9A");
@@ -1221,7 +1493,13 @@ function run(brand, version = "0.0.0") {
1221
1493
  registerSshCommands(server, brand);
1222
1494
  registerWpCommands(server, brand);
1223
1495
  registerMailCommands(server, brand);
1496
+ registerSpamFilterCommands(server, brand);
1224
1497
  registerMailFilterCommands(server, brand);
1498
+ registerAutoReplyCommands(server, brand);
1499
+ registerSmtpAbroadRestrictionCommands(server, brand);
1500
+ registerDkimCommands(server, brand);
1501
+ registerDmarcCommands(server, brand);
1502
+ registerSpfCommands(server, brand);
1225
1503
  registerFtpCommands(server, brand);
1226
1504
  registerDbCommands(server, brand);
1227
1505
  registerPhpVersionCommands(server, brand);
@@ -1252,7 +1530,7 @@ function run(brand, version = "0.0.0") {
1252
1530
  // package.json
1253
1531
  var package_default = {
1254
1532
  name: "star8-cli",
1255
- version: "1.0.2",
1533
+ version: "1.1.0",
1256
1534
  description: "Official CLI for Star8 API \u2014 manage your Star8 hosting from the terminal",
1257
1535
  type: "module",
1258
1536
  bin: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/src/index.ts","../../../shared/src/api-client.ts","../../core/src/commands/auth/login.ts","../../core/src/lib/config.ts","../../core/src/lib/command-helper.ts","../../core/src/lib/output.ts","../../core/src/commands/server/info.ts","../../core/src/commands/server/cron/index.ts","../../core/src/commands/server/wp/index.ts","../../core/src/commands/server/mail/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/ftp/index.ts","../../core/src/commands/server/db/index.ts","../../core/src/commands/server/php-version/index.ts","../../core/src/commands/server/domain/index.ts","../../core/src/commands/server/subdomain/index.ts","../../core/src/commands/server/ssl/index.ts","../../core/src/commands/server/dns/index.ts","../../core/src/commands/server/ssh/index.ts","../../core/src/commands/server/log/index.ts","../../core/src/commands/me/index.ts","../package.json","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { registerAuthCommands } from './commands/auth/login.js';\r\nimport { registerServerInfoCommands } from './commands/server/info.js';\r\nimport { registerCronCommands } from './commands/server/cron/index.js';\r\nimport { registerWpCommands } from './commands/server/wp/index.js';\r\nimport { registerMailCommands } from './commands/server/mail/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerFtpCommands } from './commands/server/ftp/index.js';\r\nimport { registerDbCommands } from './commands/server/db/index.js';\r\nimport { registerPhpVersionCommands } from './commands/server/php-version/index.js';\r\nimport { registerServerDomainCommands } from './commands/server/domain/index.js';\r\nimport { registerSubdomainCommands } from './commands/server/subdomain/index.js';\r\nimport { registerSslCommands } from './commands/server/ssl/index.js';\r\nimport { registerDnsCommands } from './commands/server/dns/index.js';\r\nimport { registerSshCommands } from './commands/server/ssh/index.js';\r\nimport { registerLogCommands } from './commands/server/log/index.js';\r\nimport { registerMeCommand } from './commands/me/index.js';\r\n\r\nexport type { BrandConfig } from 'xnp-shared';\r\n\r\nexport function run(brand: BrandConfig, version = '0.0.0'): void {\r\n const program = new Command();\r\n\r\n program\r\n .name(brand.commandName)\r\n .description(`${brand.displayName} CLI`)\r\n .version(version)\r\n .option('--format <format>', '出力形式 (json, table)', (value: string) => {\r\n if (!['json', 'table'].includes(value)) {\r\n throw new Error(`--format は json または table を指定してください(入力値: ${value})`);\r\n }\r\n return value;\r\n }, 'table')\r\n .option('--profile <name>', '使用するプロファイル')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .option('--debug', 'デバッグ出力を有効化(リクエストURL・レスポンスヘッダを表示)');\r\n\r\n registerAuthCommands(program, brand);\r\n registerMeCommand(program, brand);\r\n\r\n // サーバー管理API(/server/v1)\r\n const server = program\r\n .command('server')\r\n .description('サーバー管理API(WordPress・メール・DBなど)')\r\n .option('--servername <name>', 'サーバー名(プロファイルのデフォルトを上書き)');\r\n\r\n registerServerInfoCommands(server, brand);\r\n registerCronCommands(server, brand);\r\n registerSshCommands(server, brand);\r\n registerWpCommands(server, brand);\r\n registerMailCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerFtpCommands(server, brand);\r\n registerDbCommands(server, brand);\r\n registerPhpVersionCommands(server, brand);\r\n registerServerDomainCommands(server, brand);\r\n registerSubdomainCommands(server, brand);\r\n registerSslCommands(server, brand);\r\n registerDnsCommands(server, brand);\r\n registerLogCommands(server, brand);\r\n\r\n program.parseAsync(process.argv).catch((err: unknown) => {\r\n if (err instanceof ApiError) {\r\n console.error(`エラー [${err.errorCode}]: ${err.message}`);\r\n if (err.errors.length > 0) {\r\n for (const e of err.errors) {\r\n console.error(` - ${e}`);\r\n }\r\n }\r\n process.exit(1);\r\n }\r\n if (err instanceof Error) {\r\n console.error(`エラー: ${err.message}`);\r\n process.exit(1);\r\n }\r\n console.error('予期しないエラーが発生しました');\r\n process.exit(1);\r\n });\r\n}\r\n","const DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\nexport interface ApiErrorDetail {\r\n code: string;\r\n message: string;\r\n errors: string[];\r\n httpStatus: number;\r\n}\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly httpStatus: number,\r\n public readonly errorCode: string,\r\n public readonly errors: string[],\r\n ) {\r\n super(message);\r\n this.name = 'ApiError';\r\n }\r\n}\r\n\r\nexport interface RateLimitInfo {\r\n limit: number;\r\n remaining: number;\r\n reset: number;\r\n}\r\n\r\nexport interface ApiClientOptions {\r\n apiKey: string;\r\n apiBase: string;\r\n servername?: string;\r\n debug?: boolean;\r\n}\r\n\r\nexport class ApiClient {\r\n private readonly apiBase: string;\r\n private readonly apiKey: string;\r\n private readonly servername?: string;\r\n private readonly debug: boolean;\r\n public lastRateLimit: RateLimitInfo | null = null;\r\n\r\n constructor(opts: ApiClientOptions) {\r\n this.apiBase = opts.apiBase.replace(/\\/+$/, '');\r\n this.apiKey = opts.apiKey;\r\n this.servername = opts.servername;\r\n this.debug = opts.debug ?? false;\r\n }\r\n\r\n private serverPath(): string {\r\n if (!this.servername) {\r\n throw new Error('サーバー名が設定されていません。');\r\n }\r\n return `/v1/server/${encodeURIComponent(this.servername)}`;\r\n }\r\n\r\n // ================================================================\r\n // サーバー情報\r\n // ================================================================\r\n\r\n async getServerInfo(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info`);\r\n }\r\n\r\n async getServerUsage(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info/usage`);\r\n }\r\n\r\n // ================================================================\r\n // Cron\r\n // ================================================================\r\n\r\n async listCron(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/cron`);\r\n }\r\n\r\n async addCron(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/cron`, data);\r\n }\r\n\r\n async updateCron(cronId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/cron/${enc(cronId)}`, data);\r\n }\r\n\r\n async deleteCron(cronId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/cron/${enc(cronId)}`);\r\n }\r\n\r\n // ================================================================\r\n // WordPress\r\n // ================================================================\r\n\r\n async listWordpress(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wp`, params);\r\n }\r\n\r\n async addWordpress(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wp`, data);\r\n }\r\n\r\n async updateWordpress(wpId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n async deleteWordpress(wpId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // メールアカウント\r\n // ================================================================\r\n\r\n async listMail(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail`, params);\r\n }\r\n\r\n async getMail(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async addMail(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail`, data);\r\n }\r\n\r\n async updateMail(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}`, data);\r\n }\r\n\r\n async deleteMail(mailAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async getMailForwarding(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`);\r\n }\r\n\r\n async updateMailForwarding(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`, data);\r\n }\r\n\r\n // ================================================================\r\n // メール振り分け\r\n // ================================================================\r\n\r\n async listMailFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail-filter`, params);\r\n }\r\n\r\n async addMailFilter(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail-filter`, data);\r\n }\r\n\r\n async deleteMailFilter(filterId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);\r\n }\r\n\r\n // ================================================================\r\n // FTP\r\n // ================================================================\r\n\r\n async listFtp(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ftp`, params);\r\n }\r\n\r\n async addFtp(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ftp`, data);\r\n }\r\n\r\n async updateFtp(ftpAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ftp/${enc(ftpAccount)}`, data);\r\n }\r\n\r\n async deleteFtp(ftpAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ftp/${enc(ftpAccount)}`);\r\n }\r\n\r\n // ================================================================\r\n // MySQL\r\n // ================================================================\r\n\r\n async listDb(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db`);\r\n }\r\n\r\n async addDb(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db`, data);\r\n }\r\n\r\n async updateDb(dbName: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/${enc(dbName)}`, data);\r\n }\r\n\r\n async deleteDb(dbName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/${enc(dbName)}`);\r\n }\r\n\r\n async listDbUser(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user`);\r\n }\r\n\r\n async addDbUser(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user`, data);\r\n }\r\n\r\n async updateDbUser(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/user/${enc(dbUser)}`, data);\r\n }\r\n\r\n async deleteDbUser(dbUser: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}`);\r\n }\r\n\r\n async listDbUserGrant(dbUser: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`);\r\n }\r\n\r\n async addDbUserGrant(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n async deleteDbUserGrant(dbUser: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n // ================================================================\r\n // PHP バージョン\r\n // ================================================================\r\n\r\n async getPhpVersion(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-version`, params);\r\n }\r\n\r\n async updatePhpVersion(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-version/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // ドメイン(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDomain(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain`);\r\n }\r\n\r\n async getDomain(domain: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain/${enc(domain)}`);\r\n }\r\n\r\n async addDomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain`, data);\r\n }\r\n\r\n async updateDomain(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async deleteDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async resetDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain/${enc(domain)}/reset`, data);\r\n }\r\n\r\n // ================================================================\r\n // サブドメイン\r\n // ================================================================\r\n\r\n async listSubdomain(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/subdomain`, params);\r\n }\r\n\r\n async addSubdomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/subdomain`, data);\r\n }\r\n\r\n async updateSubdomain(subdomain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n async deleteSubdomain(subdomain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSL\r\n // ================================================================\r\n\r\n async listSsl(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssl`, params);\r\n }\r\n\r\n async installSsl(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssl`, data);\r\n }\r\n\r\n async uninstallSsl(commonName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssl/${enc(commonName)}`);\r\n }\r\n\r\n // ================================================================\r\n // DNS(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDns(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dns`, params);\r\n }\r\n\r\n async addDns(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/dns`, data);\r\n }\r\n\r\n async updateDns(dnsId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n async deleteDns(dnsId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSH\r\n // ================================================================\r\n\r\n async getSsh(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh`);\r\n }\r\n\r\n async updateSsh(data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh`, data);\r\n }\r\n\r\n async listSshKey(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh/key`);\r\n }\r\n\r\n async addSshKey(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssh/key`, data);\r\n }\r\n\r\n async updateSshKey(keyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh/key/${enc(keyId)}`, data);\r\n }\r\n\r\n async deleteSshKey(keyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssh/key/${enc(keyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // ログ\r\n // ================================================================\r\n\r\n async getAccessLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-log`, params);\r\n }\r\n\r\n async getErrorLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/error-log`, params);\r\n }\r\n\r\n // ================================================================\r\n // APIキー情報\r\n // ================================================================\r\n\r\n async getMe(): Promise<unknown> {\r\n return this.get('/v1/me');\r\n }\r\n\r\n // ================================================================\r\n // HTTP 基盤\r\n // ================================================================\r\n\r\n async get(path: string, params?: Record<string, string>): Promise<unknown> {\r\n let url = `${this.apiBase}${path}`;\r\n if (params && Object.keys(params).length > 0) {\r\n url += '?' + new URLSearchParams(params).toString();\r\n }\r\n return this.request('GET', url);\r\n }\r\n\r\n async post(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('POST', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async put(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('PUT', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async delete(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('DELETE', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n private async request(method: string, url: string, body?: Record<string, unknown>): Promise<unknown> {\r\n const headers: Record<string, string> = {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'Accept': 'application/json',\r\n };\r\n\r\n const init: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n headers['Content-Type'] = 'application/json';\r\n init.body = JSON.stringify(body);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`${method} ${url}`);\r\n if (init.body) dbg(`Body: ${init.body as string}`);\r\n }\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, init);\r\n } catch (err) {\r\n throw new Error(`通信エラー: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`HTTP ${response.status} ${response.statusText}`);\r\n const debugHeaders = ['x-ratelimit-limit', 'x-ratelimit-remaining', 'x-ratelimit-reset', 'x-concurrent-limit', 'x-concurrent-remaining', 'content-type'];\r\n for (const h of debugHeaders) {\r\n const v = response.headers.get(h);\r\n if (v !== null) dbg(` ${h}: ${v}`);\r\n }\r\n }\r\n\r\n const rateLimitHeader = response.headers.get('x-ratelimit-limit');\r\n if (rateLimitHeader) {\r\n this.lastRateLimit = {\r\n limit: parseInt(rateLimitHeader, 10),\r\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\r\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\r\n };\r\n }\r\n\r\n const text = await response.text();\r\n let data: unknown;\r\n try {\r\n data = JSON.parse(text);\r\n } catch {\r\n if (this.debug) {\r\n process.stderr.write(`[DEBUG] Raw response: ${text.substring(0, 500)}\\n`);\r\n }\r\n throw new ApiError(`Response parse error (HTTP ${response.status})`, response.status, 'PARSE_ERROR', []);\r\n }\r\n\r\n if (!response.ok) {\r\n const err = data as { error?: { code?: string; message?: string; errors?: string[] } };\r\n const errorCode = err?.error?.code || 'UNKNOWN_ERROR';\r\n const errorMessage = err?.error?.message || 'エラーが発生しました';\r\n const errors = err?.error?.errors || [];\r\n throw new ApiError(errorMessage, response.status, errorCode, errors);\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nfunction enc(s: string): string {\r\n return encodeURIComponent(s);\r\n}\r\n","import { Command } from 'commander';\r\nimport { password } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient, ApiError } from 'xnp-shared';\r\nimport { loadConfig, saveConfig } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nfunction maskApiKey(apiKey: string): string {\r\n return `${apiKey.substring(0, 8)}...`;\r\n}\r\n\r\nexport function registerAuthCommands(program: Command, brand: BrandConfig): void {\r\n const auth = program\r\n .command('auth')\r\n .description('認証設定');\r\n\r\n auth\r\n .command('login')\r\n .description('APIキーを設定(サーバー名は自動検出)')\r\n .option('--api-key <key>', 'APIキー')\r\n .option('--servername <name>', 'サーバー名(自動検出を上書き)')\r\n .action(async (opts: { apiKey?: string; servername?: string }, cmd: Command) => {\r\n const profileName: string = (cmd.optsWithGlobals().profile as string | undefined) ?? 'default';\r\n let apiKey = opts.apiKey;\r\n let servername = opts.servername;\r\n\r\n if (!apiKey) {\r\n apiKey = await password({ message: 'APIキーを入力:', mask: true });\r\n }\r\n if (!apiKey) {\r\n console.error('エラー: APIキーは必須です');\r\n process.exit(1);\r\n }\r\n\r\n console.error('認証情報を検証中...');\r\n const client = new ApiClient({ apiKey, apiBase: brand.apiBase });\r\n let meData: Record<string, unknown>;\r\n try {\r\n meData = await client.getMe() as Record<string, unknown>;\r\n } catch (err) {\r\n if (err instanceof ApiError && err.errorCode === 'UNAUTHORIZED') {\r\n console.error('エラー: APIキーが無効です。正しいAPIキーを指定してください。');\r\n process.exit(1);\r\n }\r\n throw err;\r\n }\r\n console.error('✓ 認証に成功しました');\r\n\r\n if (!servername && meData.servername) {\r\n servername = meData.servername as string;\r\n console.error(` サーバー名を自動検出しました: ${servername}`);\r\n }\r\n\r\n const config = loadConfig(brand);\r\n config.profiles[profileName] = {\r\n apiKey,\r\n ...(servername ? { servername } : {}),\r\n };\r\n if (!config.defaultProfile) {\r\n config.defaultProfile = profileName;\r\n }\r\n saveConfig(brand, config);\r\n\r\n console.error(`✓ プロファイル \"${profileName}\" を保存しました`);\r\n console.error(` 設定ファイル: ~/.config/${brand.configDir}/config.json`);\r\n });\r\n\r\n auth\r\n .command('status')\r\n .description('現在の認証状態を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profileName = (cmd.optsWithGlobals().profile as string | undefined) || config.defaultProfile || 'default';\r\n const profile = config.profiles[profileName];\r\n\r\n if (!profile) {\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: false,\r\n profile: profileName,\r\n message: `プロファイル \"${profileName}\" が見つかりません`,\r\n }, format);\r\n } else {\r\n console.error(`プロファイル \"${profileName}\" が見つかりません`);\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: true,\r\n profile: profileName,\r\n api_key: maskApiKey(profile.apiKey),\r\n servername: profile.servername ?? null,\r\n api_base: brand.apiBase,\r\n }, format);\r\n return;\r\n }\r\n\r\n console.log(`プロファイル: ${profileName}`);\r\n console.log(`APIキー: ${maskApiKey(profile.apiKey)}`);\r\n if (profile.servername) {\r\n console.log(`サーバー名: ${profile.servername}`);\r\n }\r\n console.log(`APIエンドポイント: ${brand.apiBase}`);\r\n });\r\n\r\n auth\r\n .command('profiles')\r\n .description('プロファイル一覧を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profiles = Object.keys(config.profiles);\r\n\r\n if (profiles.length === 0) {\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: [],\r\n message: 'プロファイルが見つかりません',\r\n }, format);\r\n } else {\r\n console.error('プロファイルが見つかりません');\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n const rows = profiles.map((name) => {\r\n const p = config.profiles[name]!;\r\n return {\r\n name,\r\n default: name === config.defaultProfile,\r\n api_key: maskApiKey(p.apiKey),\r\n servername: p.servername ?? null,\r\n };\r\n });\r\n\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: rows,\r\n }, format);\r\n return;\r\n }\r\n\r\n for (const name of profiles) {\r\n const marker = name === config.defaultProfile ? ' (default)' : '';\r\n const p = config.profiles[name]!;\r\n const key = maskApiKey(p.apiKey);\r\n const sv = p.servername ? ` servername=${p.servername}` : '';\r\n console.log(`${name}${marker}: key=${key}${sv}`);\r\n }\r\n });\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport type { AppConfig, Profile } from '../types.js';\r\n\r\nfunction getConfigDir(brand: BrandConfig): string {\r\n const home = os.homedir();\r\n return path.join(home, '.config', brand.configDir);\r\n}\r\n\r\nfunction getConfigPath(brand: BrandConfig): string {\r\n return path.join(getConfigDir(brand), 'config.json');\r\n}\r\n\r\nexport function loadConfig(brand: BrandConfig): AppConfig {\r\n const configPath = getConfigPath(brand);\r\n if (!fs.existsSync(configPath)) {\r\n return { defaultProfile: 'default', profiles: {} };\r\n }\r\n const raw = fs.readFileSync(configPath, 'utf-8');\r\n return JSON.parse(raw) as AppConfig;\r\n}\r\n\r\nexport function saveConfig(brand: BrandConfig, config: AppConfig): void {\r\n const configDir = getConfigDir(brand);\r\n fs.mkdirSync(configDir, { recursive: true });\r\n const configPath = getConfigPath(brand);\r\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function getActiveProfile(brand: BrandConfig, profileName?: string): Profile | null {\r\n const envPrefix = brand.brand.toUpperCase();\r\n const envApiKey = process.env[`${envPrefix}_API_KEY`] || process.env['XSERVER_API_KEY'];\r\n const envServername = process.env[`${envPrefix}_SERVERNAME`] || process.env['XSERVER_SERVERNAME'];\r\n\r\n if (envApiKey) {\r\n return {\r\n apiKey: envApiKey,\r\n servername: envServername,\r\n };\r\n }\r\n\r\n const config = loadConfig(brand);\r\n const name = profileName || config.defaultProfile || 'default';\r\n return config.profiles[name] || null;\r\n}\r\n","import type { Command } from 'commander';\r\nimport { confirm } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from './config.js';\r\nimport { formatOutput, type OutputFormat } from './output.js';\r\n\r\nfunction findRoot(cmd: Command): Command {\r\n let root = cmd;\r\n while (root.parent) root = root.parent;\r\n return root;\r\n}\r\n\r\nexport function resolveClient(cmd: Command, brand: BrandConfig): ApiClient {\r\n const root = findRoot(cmd);\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const servername = resolveServername(cmd) ?? profile.servername;\r\n return new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername,\r\n debug,\r\n });\r\n}\r\n\r\nfunction resolveServername(cmd: Command): string | undefined {\r\n let current: Command | null = cmd;\r\n while (current) {\r\n const val = current.opts()?.servername as string | undefined;\r\n if (val) return val;\r\n current = current.parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getFormat(cmd: Command): OutputFormat {\r\n const root = findRoot(cmd);\r\n return (root.opts().format as OutputFormat) || 'table';\r\n}\r\n\r\nexport function printResult(data: unknown, format: OutputFormat): void {\r\n console.log(formatOutput(data, format));\r\n}\r\n\r\nexport async function confirmDestructiveAction(cmd: Command, message: string): Promise<void> {\r\n const root = findRoot(cmd);\r\n if (root.opts().yes || process.argv.includes('--yes') || process.argv.includes('-y')) return;\r\n\r\n const ok = await confirm({ message, default: false });\r\n if (!ok) {\r\n console.error('キャンセルしました');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function pickDefined(obj: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value !== undefined) result[key] = value;\r\n }\r\n return result;\r\n}\r\n","export type OutputFormat = 'json' | 'table';\r\n\r\nexport function formatOutput(data: unknown, format: OutputFormat): string {\r\n if (format === 'json') {\r\n return JSON.stringify(data, null, 2);\r\n }\r\n return formatTable(data);\r\n}\r\n\r\nfunction formatTable(data: unknown): string {\r\n if (data === null || data === undefined) {\r\n return '(データなし)';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) return '(データなし)';\r\n return renderArrayTable(data as Record<string, unknown>[]);\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const obj = data as Record<string, unknown>;\r\n const arrayEntry = Object.entries(obj).find(\r\n ([, v]) => Array.isArray(v) && (v.length === 0 || (typeof v[0] === 'object' && v[0] !== null)),\r\n );\r\n if (arrayEntry) {\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayEntry[0]);\r\n const parts: string[] = [];\r\n if (scalarEntries.length > 0) {\r\n parts.push(renderKeyValueTable(Object.fromEntries(scalarEntries)));\r\n parts.push('');\r\n }\r\n parts.push(renderArrayTable(arrayEntry[1] as Record<string, unknown>[]));\r\n return parts.join('\\n');\r\n }\r\n return renderKeyValueTable(obj);\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\nfunction renderKeyValueTable(obj: Record<string, unknown>): string {\r\n const entries = Object.entries(obj).map(([key, value]) => ({\r\n key,\r\n value: formatValue(value),\r\n }));\r\n\r\n const maxKeyLen = Math.max(...entries.map(e => displayWidth(e.key)));\r\n const lines = entries.map(e => `${padRight(e.key, maxKeyLen)} ${e.value}`);\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderArrayTable(items: Record<string, unknown>[]): string {\r\n if (items.length === 0) return '(データなし)';\r\n\r\n const keys = Object.keys(items[0]!);\r\n\r\n const colWidths = keys.map(key => {\r\n const headerWidth = displayWidth(key);\r\n const maxDataWidth = Math.max(\r\n ...items.map(item => displayWidth(formatValue(item[key]))),\r\n );\r\n return Math.max(headerWidth, maxDataWidth);\r\n });\r\n\r\n const header = keys.map((key, i) => padRight(key, colWidths[i]!)).join(' ');\r\n const separator = colWidths.map(w => '-'.repeat(w)).join(' ');\r\n const rows = items.map(item =>\r\n keys.map((key, i) => padRight(formatValue(item[key]), colWidths[i]!)).join(' '),\r\n );\r\n\r\n return [header, separator, ...rows].join('\\n');\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return String(value);\r\n}\r\n\r\nfunction displayWidth(str: string): number {\r\n let width = 0;\r\n for (const char of str) {\r\n const code = char.codePointAt(0)!;\r\n if (\r\n (code >= 0x1100 && code <= 0x115f) ||\r\n (code >= 0x2e80 && code <= 0xa4cf) ||\r\n (code >= 0xac00 && code <= 0xd7af) ||\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n (code >= 0xfe10 && code <= 0xfe6f) ||\r\n (code >= 0xff01 && code <= 0xff60) ||\r\n (code >= 0xffe0 && code <= 0xffe6) ||\r\n (code >= 0x20000 && code <= 0x2fffd) ||\r\n (code >= 0x30000 && code <= 0x3fffd)\r\n ) {\r\n width += 2;\r\n } else {\r\n width += 1;\r\n }\r\n }\r\n return width;\r\n}\r\n\r\nfunction padRight(str: string, targetWidth: number): string {\r\n const currentWidth = displayWidth(str);\r\n const padding = Math.max(0, targetWidth - currentWidth);\r\n return str + ' '.repeat(padding);\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerServerInfoCommands(parent: Command, brand: BrandConfig): void {\r\n parent\r\n .command('info')\r\n .description('サーバー情報を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerInfo(), getFormat(parent));\r\n });\r\n\r\n parent\r\n .command('usage')\r\n .description('サーバー利用状況を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerUsage(), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerCronCommands(parent: Command, brand: BrandConfig): void {\r\n const cron = parent\r\n .command('cron')\r\n .description('Cron設定');\r\n\r\n cron\r\n .command('list')\r\n .description('Cron一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listCron(), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('add')\r\n .description('Cronを新規追加')\r\n .requiredOption('--minute <value>', '分(例: */5, 0, *)')\r\n .requiredOption('--hour <value>', '時(例: *, 3, 0-6)')\r\n .requiredOption('--command <value>', '実行コマンド')\r\n .option('--day <value>', '日', '*')\r\n .option('--month <value>', '月', '*')\r\n .option('--weekday <value>', '曜日', '*')\r\n .option('--comment <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n printResult(await client.addCron(data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('update <cronId>')\r\n .description('Cronを更新')\r\n .option('--minute <value>', '分')\r\n .option('--hour <value>', '時')\r\n .option('--day <value>', '日')\r\n .option('--month <value>', '月')\r\n .option('--weekday <value>', '曜日')\r\n .option('--command <value>', '実行コマンド')\r\n .option('--comment <value>', 'メモ')\r\n .option('--enabled <value>', '有効/無効 (true/false)')\r\n .action(async (cronId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n if (opts.enabled !== undefined) data.enabled = opts.enabled === 'true';\r\n printResult(await client.updateCron(cronId, data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('delete <cronId>')\r\n .description('Cronを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (cronId: string) => {\r\n await confirmDestructiveAction(parent, `Cron \"${cronId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteCron(cronId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerWpCommands(parent: Command, brand: BrandConfig): void {\r\n const wp = parent\r\n .command('wp')\r\n .description('WordPress簡単インストール');\r\n\r\n wp\r\n .command('list')\r\n .description('WordPress一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listWordpress(params), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('add')\r\n .description('WordPressを新規インストール')\r\n .requiredOption('--url <url>', 'インストール先URL(例: example.com/blog)')\r\n .requiredOption('--title <title>', 'サイトタイトル')\r\n .requiredOption('--admin-username <username>', '管理者ユーザー名')\r\n .requiredOption('--admin-password <password>', '管理者パスワード')\r\n .requiredOption('--admin-email <email>', '管理者メールアドレス')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n url: opts.url, title: opts.title,\r\n admin_username: opts.adminUsername, admin_password: opts.adminPassword,\r\n admin_email: opts.adminEmail, memo: opts.memo,\r\n });\r\n printResult(await client.addWordpress(data), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('update <wpId>')\r\n .description('WordPress設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (wpId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordpress(wpId, pickDefined({ memo: opts.memo })), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('delete <wpId>')\r\n .description('WordPressを削除')\r\n .option('--delete-db <value>', '関連するMySQLデータベースも削除するか(デフォルト: true)')\r\n .option('--delete-db-user <value>', '関連するMySQLユーザーも削除するか(デフォルト: false)')\r\n .option('--delete-cron <value>', 'キャッシュ自動削除Cronも削除するか(デフォルト: true)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (wpId: string, opts) => {\r\n await confirmDestructiveAction(parent, `WordPress \"${wpId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n delete_db: opts.deleteDb !== undefined ? opts.deleteDb === 'true' : undefined,\r\n delete_db_user: opts.deleteDbUser !== undefined ? opts.deleteDbUser === 'true' : undefined,\r\n delete_cron: opts.deleteCron !== undefined ? opts.deleteCron === 'true' : undefined,\r\n });\r\n printResult(await client.deleteWordpress(wpId, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailCommands(parent: Command, brand: BrandConfig): void {\r\n const mail = parent\r\n .command('mail')\r\n .description('メールアカウント設定');\r\n\r\n mail\r\n .command('list')\r\n .description('メールアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMail(params), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('get <mailAccount>')\r\n .description('メールアカウント詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('add <mailAddress>')\r\n .description('メールアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAddress: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n mail_address: mailAddress, password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addMail(data), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('update <mailAccount>')\r\n .description('メールアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateMail(mailAccount, pickDefined({\r\n password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('delete <mailAccount>')\r\n .description('メールアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (mailAccount: string) => {\r\n await confirmDestructiveAction(parent, `メールアカウント \"${mailAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-get <mailAccount>')\r\n .description('メール転送設定を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMailForwarding(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-update <mailAccount>')\r\n .description('メール転送設定を更新')\r\n .option('--forwarding-addresses <addresses>', '転送先アドレス(カンマ区切り)')\r\n .option('--keep-in-mailbox <value>', '転送後もメールボックスに残すか(true/false)')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.forwardingAddresses) data.forwarding_addresses = opts.forwardingAddresses.split(',').map((a: string) => a.trim());\r\n if (opts.keepInMailbox !== undefined) data.keep_in_mailbox = opts.keepInMailbox === 'true';\r\n printResult(await client.updateMailForwarding(mailAccount, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const mailFilter = parent\r\n .command('mail-filter')\r\n .description('メール振り分け設定');\r\n\r\n mailFilter\r\n .command('list')\r\n .description('メール振り分け設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMailFilter(params), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('add')\r\n .description('メール振り分け設定を新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--condition-keyword <keyword>', '条件キーワード')\r\n .requiredOption('--condition-field <field>', '条件対象(subject / from / to / body / header)')\r\n .option('--condition-match-type <type>', '一致条件(contain / match / start_from。デフォルト: contain)')\r\n .requiredOption('--action-type <type>', 'アクション種別(mail_address / spam_folder / trash / delete)')\r\n .option('--action-target <target>', '転送先メールアドレス(action-typeがmail_addressの場合)')\r\n .option('--action-method <method>', '処理方法(move / copy。デフォルト: move)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {\r\n domain: opts.domain,\r\n conditions: [{\r\n keyword: opts.conditionKeyword,\r\n field: opts.conditionField,\r\n match_type: opts.conditionMatchType || 'contain',\r\n }],\r\n action: {\r\n type: opts.actionType,\r\n target: opts.actionTarget || '',\r\n method: opts.actionMethod || 'move',\r\n },\r\n };\r\n printResult(await client.addMailFilter(data), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('delete <filterId>')\r\n .description('メール振り分け設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (filterId: string) => {\r\n await confirmDestructiveAction(parent, `メール振り分け設定 \"${filterId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMailFilter(filterId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerFtpCommands(parent: Command, brand: BrandConfig): void {\r\n const ftp = parent\r\n .command('ftp')\r\n .description('FTPアカウント設定');\r\n\r\n ftp\r\n .command('list')\r\n .description('FTPアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listFtp(params), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('add <ftpAccount>')\r\n .description('FTPアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB。0で無制限)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n ftp_account: ftpAccount, password: opts.password,\r\n directory: opts.directory, quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addFtp(data), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('update <ftpAccount>')\r\n .description('FTPアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateFtp(ftpAccount, pickDefined({\r\n password: opts.password, directory: opts.directory,\r\n quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('delete <ftpAccount>')\r\n .description('FTPアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (ftpAccount: string) => {\r\n await confirmDestructiveAction(parent, `FTPアカウント \"${ftpAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteFtp(ftpAccount), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDbCommands(parent: Command, brand: BrandConfig): void {\r\n const db = parent\r\n .command('db')\r\n .description('MySQL設定');\r\n\r\n db\r\n .command('list')\r\n .description('データベース一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDb(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('add <nameSuffix>')\r\n .description('データベースを新規作成')\r\n .option('--character-set <charset>', '文字コード(utf8mb4 / UTF-8 / EUC-JP / SHIFT-JIS / Binary。デフォルト: utf8mb4)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDb(pickDefined({\r\n name_suffix: nameSuffix, character_set: opts.characterSet, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('update <dbName>')\r\n .description('データベースのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDb(dbName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('delete <dbName>')\r\n .description('データベースを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbName: string) => {\r\n await confirmDestructiveAction(parent, `データベース \"${dbName}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDb(dbName), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-list')\r\n .description('MySQLユーザー一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUser(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-add <nameSuffix>')\r\n .description('MySQLユーザーを新規作成')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUser(pickDefined({\r\n name_suffix: nameSuffix, password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-update <dbUser>')\r\n .description('MySQLユーザー設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDbUser(dbUser, pickDefined({\r\n password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-delete <dbUser>')\r\n .description('MySQLユーザーを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUser(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-list <dbUser>')\r\n .description('MySQLユーザーの権限一覧を取得')\r\n .action(async (dbUser: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUserGrant(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-add <dbUser>')\r\n .description('MySQLユーザーに権限を追加')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-delete <dbUser>')\r\n .description('MySQLユーザーの権限を削除')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string, opts) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" のデータベース \"${opts.dbName}\" への権限を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerPhpVersionCommands(parent: Command, brand: BrandConfig): void {\r\n const phpVer = parent\r\n .command('php-version')\r\n .description('PHPバージョン設定');\r\n\r\n phpVer\r\n .command('get')\r\n .description('PHPバージョン確認')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.getPhpVersion(params), getFormat(parent));\r\n });\r\n\r\n phpVer\r\n .command('update <domain>')\r\n .description('PHPバージョンを変更')\r\n .requiredOption('--php <version>', 'PHPバージョン(例: 8.2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpVersion(domain, { version: opts.php }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerServerDomainCommands(parent: Command, brand: BrandConfig): void {\r\n const domain = parent\r\n .command('domain')\r\n .description('ドメイン設定');\r\n\r\n domain\r\n .command('list')\r\n .description('ドメイン設定一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDomain(), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('get <domain>')\r\n .description('ドメイン設定詳細を取得')\r\n .action(async (domainName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDomain(domainName), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('add <domain>')\r\n .description('ドメイン設定を新規追加')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--redirect-https <value>', 'HTTPS転送設定(デフォルト: sslと同じ値)')\r\n .option('--ai-crawler-block <value>', 'AIクローラー遮断設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { domain: domainName };\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.redirectHttps !== undefined) data.redirect_https = opts.redirectHttps === 'true';\r\n if (opts.aiCrawlerBlock !== undefined) data.ai_crawler_block_enabled = opts.aiCrawlerBlock === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addDomain(data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('update <domain>')\r\n .description('ドメイン設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDomain(domainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('delete <domain>')\r\n .description('ドメイン設定を削除')\r\n .option('--delete-files', 'ユーザー公開領域のドメインディレクトリも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteDomain(domainName, data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('reset <domain>')\r\n .description('ドメイン設定を初期化')\r\n .requiredOption('--type <type>', 'リセット種別(all: 全初期化 / web: Web領域のみ / other: Web以外)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を \"${opts.type}\" で初期化します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetDomain(domainName, { type: opts.type }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSubdomainCommands(parent: Command, brand: BrandConfig): void {\r\n const subdomain = parent\r\n .command('subdomain')\r\n .description('サブドメイン設定');\r\n\r\n subdomain\r\n .command('list')\r\n .description('サブドメイン設定一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSubdomain(params), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('add <subdomain>')\r\n .description('サブドメインを新規追加')\r\n .option('--document-root-type <type>', 'ドキュメントルート種別(subdomain_only: /public_html/sub, full_subdomain: /public_html/sub.example.com)')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { subdomain: subdomainName };\r\n if (opts.documentRootType !== undefined) data.document_root_type = opts.documentRootType;\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addSubdomain(data), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('update <subdomain>')\r\n .description('サブドメインのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSubdomain(subdomainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('delete <subdomain>')\r\n .description('サブドメインを削除')\r\n .option('--delete-files', '関連ファイルも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (subdomainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `サブドメイン \"${subdomainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteSubdomain(subdomainName, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSslCommands(parent: Command, brand: BrandConfig): void {\r\n const ssl = parent\r\n .command('ssl')\r\n .description('SSL設定');\r\n\r\n ssl\r\n .command('list')\r\n .description('SSL設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSsl(params), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('install <commonName>')\r\n .description('無料SSLをインストール')\r\n .action(async (commonName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.installSsl(pickDefined({\r\n common_name: commonName,\r\n })), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('uninstall <commonName>')\r\n .description('無料SSLをアンインストール')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (commonName: string) => {\r\n await confirmDestructiveAction(parent, `無料SSL \"${commonName}\" をアンインストールします。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.uninstallSsl(commonName), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDnsCommands(parent: Command, brand: BrandConfig): void {\r\n const dns = parent\r\n .command('dns')\r\n .description('DNSレコード設定');\r\n\r\n dns\r\n .command('list')\r\n .description('DNSレコード一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDns(params), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('add')\r\n .description('DNSレコードを新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--host <host>', 'ホスト名(@でapex)')\r\n .requiredOption('--type <type>', 'レコードタイプ(A / AAAA / CNAME / MX / TXT / SRV / CAA)')\r\n .requiredOption('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400。デフォルト: 3600)')\r\n .option('--priority <priority>', '優先度(MX/SRVレコード用)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDns(pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('update <dnsId>')\r\n .description('DNSレコードを更新')\r\n .option('--domain <domain>', 'ドメイン')\r\n .option('--host <host>', 'ホスト名')\r\n .option('--type <type>', 'レコードタイプ')\r\n .option('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400)')\r\n .option('--priority <priority>', '優先度')\r\n .action(async (dnsId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDns(dnsId, pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('delete <dnsId>')\r\n .description('DNSレコードを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dnsId: string) => {\r\n await confirmDestructiveAction(parent, `DNSレコード \"${dnsId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDns(dnsId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSshCommands(parent: Command, brand: BrandConfig): void {\r\n const ssh = parent\r\n .command('ssh')\r\n .description('SSH設定');\r\n\r\n ssh\r\n .command('show')\r\n .description('SSH設定を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getSsh(), getFormat(parent));\r\n });\r\n\r\n ssh\r\n .command('update')\r\n .description('SSH設定を変更')\r\n .option('--ssh-enabled <value>', 'SSH接続の有効/無効(true/false)')\r\n .option('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.sshEnabled !== undefined) data.ssh_enabled = opts.sshEnabled === 'true';\r\n if (opts.abroadAccessRestriction !== undefined) data.abroad_access_restriction = opts.abroadAccessRestriction === 'true';\r\n printResult(await client.updateSsh(data), getFormat(parent));\r\n });\r\n\r\n const key = ssh\r\n .command('key')\r\n .description('SSH公開鍵管理');\r\n\r\n key\r\n .command('list')\r\n .description('SSH公開鍵一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listSshKey(), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('add')\r\n .description('SSH公開鍵を登録')\r\n .option('--public-key <key>', '公開鍵(手動登録時)')\r\n .option('--generate', 'サーバー側で鍵ペアを自動生成')\r\n .option('--passphrase <value>', 'パスフレーズ(自動生成時)')\r\n .requiredOption('--label <value>', 'ラベル')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { label: opts.label };\r\n if (opts.generate) {\r\n data.generate = true;\r\n if (opts.passphrase !== undefined) data.passphrase = opts.passphrase;\r\n } else {\r\n if (opts.publicKey) data.public_key = opts.publicKey;\r\n }\r\n printResult(await client.addSshKey(data), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('update <keyId>')\r\n .description('SSH公開鍵を更新')\r\n .option('--label <value>', 'ラベル')\r\n .option('--status <value>', 'ステータス(on/off)')\r\n .action(async (keyId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSshKey(keyId, pickDefined({\r\n label: opts.label,\r\n status: opts.status,\r\n })), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('delete <keyId>')\r\n .description('SSH公開鍵を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (keyId: string) => {\r\n await confirmDestructiveAction(parent, `SSH公開鍵 \"${keyId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSshKey(keyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerLogCommands(parent: Command, brand: BrandConfig): void {\r\n const log = parent\r\n .command('log')\r\n .description('ログ');\r\n\r\n log\r\n .command('access')\r\n .description('アクセスログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getAccessLog(params), getFormat(parent));\r\n });\r\n\r\n log\r\n .command('error')\r\n .description('エラーログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getErrorLog(params), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerMeCommand(program: Command, brand: BrandConfig): void {\r\n program\r\n .command('me')\r\n .description('現在のAPIキー情報を表示')\r\n .action(async (_opts: Record<string, unknown>, cmd: Command) => {\r\n const root = cmd.parent!;\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const client = new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername: profile.servername,\r\n debug,\r\n });\r\n printResult(await client.getMe(), getFormat(cmd));\r\n });\r\n}\r\n","{\n \"name\": \"star8-cli\",\n \"version\": \"1.0.2\",\n \"description\": \"Official CLI for Star8 API — manage your Star8 hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"star8\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"tsc\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"keywords\": [\n \"star8\",\n \"cli\",\n \"api\",\n \"hosting\",\n \"server\",\n \"webhosting\"\n ],\n \"author\": \"Xserver Inc.\",\n \"license\": \"MIT\",\n \"homepage\": \"https://developer.xserver.ne.jp\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.10.1\",\n \"commander\": \"^13.0.0\"\n },\n \"devDependencies\": {\n \"xnp-cli-core\": \"*\",\n \"xnp-shared\": \"*\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","import { run } from 'xnp-cli-core';\r\nimport pkg from '../package.json' with { type: 'json' };\r\n\r\nrun({\r\n brand: 'star8',\r\n apiBase: 'https://api.star.ne.jp',\r\n displayName: 'Star8 API',\r\n commandName: 'star8',\r\n configDir: 'star8-cli',\r\n}, pkg.version);\r\n"],"mappings":";;;AAAA,SAAS,eAAe;;;ACAxB,IAAM,qBAAqB;AASrB,IAAO,WAAP,cAAwB,MAAK;EAGf;EACA;EACA;EAJlB,YACE,SACgB,YACA,WACA,QAAgB;AAEhC,UAAM,OAAO;AAJG,SAAA,aAAA;AACA,SAAA,YAAA;AACA,SAAA,SAAA;AAGhB,SAAK,OAAO;EACd;;AAgBI,IAAO,YAAP,MAAgB;EACH;EACA;EACA;EACA;EACV,gBAAsC;EAE7C,YAAY,MAAsB;AAChC,SAAK,UAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAC9C,SAAK,SAAS,KAAK;AACnB,SAAK,aAAa,KAAK;AACvB,SAAK,QAAQ,KAAK,SAAS;EAC7B;EAEQ,aAAU;AAChB,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,kGAAkB;IACpC;AACA,WAAO,cAAc,mBAAmB,KAAK,UAAU,CAAC;EAC1D;;;;EAMA,MAAM,gBAAa;AACjB,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,cAAc;EACpD;EAEA,MAAM,iBAAc;AAClB,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,oBAAoB;EAC1D;;;;EAMA,MAAM,WAAQ;AACZ,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,OAAO;EAC7C;EAEA,MAAM,QAAQ,MAA6B;AACzC,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI;EACpD;EAEA,MAAM,WAAW,QAAgB,MAA6B;AAC5D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI;EAClE;EAEA,MAAM,WAAW,QAAc;AAC7B,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,MAAM,CAAC,EAAE;EAC/D;;;;EAMA,MAAM,cAAc,QAA+B;AACjD,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,OAAO,MAAM;EACnD;EAEA,MAAM,aAAa,MAA6B;AAC9C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI;EAClD;EAEA,MAAM,gBAAgB,MAAc,MAA6B;AAC/D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI;EAC9D;EAEA,MAAM,gBAAgB,MAAc,MAA8B;AAChE,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI;EACjE;;;;EAMA,MAAM,SAAS,QAA+B;AAC5C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,MAAM;EACrD;EAEA,MAAM,QAAQ,aAAmB;AAC/B,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,WAAW,CAAC,EAAE;EACjE;EAEA,MAAM,QAAQ,MAA6B;AACzC,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI;EACpD;EAEA,MAAM,WAAW,aAAqB,MAA6B;AACjE,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,WAAW,CAAC,IAAI,IAAI;EACvE;EAEA,MAAM,WAAW,aAAmB;AAClC,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,WAAW,CAAC,EAAE;EACpE;EAEA,MAAM,kBAAkB,aAAmB;AACzC,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,WAAW,CAAC,aAAa;EAC5E;EAEA,MAAM,qBAAqB,aAAqB,MAA6B;AAC3E,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS,IAAI,WAAW,CAAC,eAAe,IAAI;EAClF;;;;EAMA,MAAM,eAAe,QAA+B;AAClD,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,gBAAgB,MAAM;EAC5D;EAEA,MAAM,cAAc,MAA6B;AAC/C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,gBAAgB,IAAI;EAC3D;EAEA,MAAM,iBAAiB,UAAgB;AACrC,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,gBAAgB,IAAI,QAAQ,CAAC,EAAE;EACxE;;;;EAMA,MAAM,QAAQ,QAA+B;AAC3C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,MAAM;EACpD;EAEA,MAAM,OAAO,MAA6B;AACxC,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI;EACnD;EAEA,MAAM,UAAU,YAAoB,MAA6B;AAC/D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI,UAAU,CAAC,IAAI,IAAI;EACrE;EAEA,MAAM,UAAU,YAAkB;AAChC,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI,UAAU,CAAC,EAAE;EAClE;;;;EAMA,MAAM,SAAM;AACV,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,KAAK;EAC3C;EAEA,MAAM,MAAM,MAA6B;AACvC,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI;EAClD;EAEA,MAAM,SAAS,QAAgB,MAA6B;AAC1D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI;EAChE;EAEA,MAAM,SAAS,QAAc;AAC3B,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,OAAO,IAAI,MAAM,CAAC,EAAE;EAC7D;EAEA,MAAM,aAAU;AACd,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,UAAU;EAChD;EAEA,MAAM,UAAU,MAA6B;AAC3C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI;EACvD;EAEA,MAAM,aAAa,QAAgB,MAA6B;AAC9D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,MAAM,CAAC,IAAI,IAAI;EACrE;EAEA,MAAM,aAAa,QAAc;AAC/B,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,MAAM,CAAC,EAAE;EAClE;EAEA,MAAM,gBAAgB,QAAc;AAClC,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,MAAM,CAAC,QAAQ;EACrE;EAEA,MAAM,eAAe,QAAgB,MAA6B;AAChE,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,MAAM,CAAC,UAAU,IAAI;EAC5E;EAEA,MAAM,kBAAkB,QAAgB,MAA8B;AACpE,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,MAAM,CAAC,UAAU,IAAI;EAC9E;;;;EAMA,MAAM,cAAc,QAA+B;AACjD,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,gBAAgB,MAAM;EAC5D;EAEA,MAAM,iBAAiB,QAAgB,MAA6B;AAClE,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,gBAAgB,IAAI,MAAM,CAAC,IAAI,IAAI;EACzE;;;;EAMA,MAAM,aAAU;AACd,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,SAAS;EAC/C;EAEA,MAAM,UAAU,QAAc;AAC5B,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,WAAW,IAAI,MAAM,CAAC,EAAE;EAC9D;EAEA,MAAM,UAAU,MAA6B;AAC3C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,WAAW,IAAI;EACtD;EAEA,MAAM,aAAa,QAAgB,MAA6B;AAC9D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI;EACpE;EAEA,MAAM,aAAa,QAAgB,MAA8B;AAC/D,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI;EACvE;EAEA,MAAM,YAAY,QAAgB,MAA8B;AAC9D,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,WAAW,IAAI,MAAM,CAAC,UAAU,IAAI;EAC3E;;;;EAMA,MAAM,cAAc,QAA+B;AACjD,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,cAAc,MAAM;EAC1D;EAEA,MAAM,aAAa,MAA6B;AAC9C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,cAAc,IAAI;EACzD;EAEA,MAAM,gBAAgB,WAAmB,MAA6B;AACpE,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,cAAc,IAAI,SAAS,CAAC,IAAI,IAAI;EAC1E;EAEA,MAAM,gBAAgB,WAAmB,MAA8B;AACrE,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,cAAc,IAAI,SAAS,CAAC,IAAI,IAAI;EAC7E;;;;EAMA,MAAM,QAAQ,QAA+B;AAC3C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,MAAM;EACpD;EAEA,MAAM,WAAW,MAA6B;AAC5C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI;EACnD;EAEA,MAAM,aAAa,YAAkB;AACnC,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI,UAAU,CAAC,EAAE;EAClE;;;;EAMA,MAAM,QAAQ,QAA+B;AAC3C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,MAAM;EACpD;EAEA,MAAM,OAAO,MAA6B;AACxC,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI;EACnD;EAEA,MAAM,UAAU,OAAe,MAA6B;AAC1D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI;EAChE;EAEA,MAAM,UAAU,OAAe,MAA8B;AAC3D,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI;EACnE;;;;EAMA,MAAM,SAAM;AACV,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,MAAM;EAC5C;EAEA,MAAM,UAAU,MAA6B;AAC3C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,QAAQ,IAAI;EAClD;EAEA,MAAM,aAAU;AACd,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,UAAU;EAChD;EAEA,MAAM,UAAU,MAA6B;AAC3C,WAAO,KAAK,KAAK,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI;EACvD;EAEA,MAAM,aAAa,OAAe,MAA6B;AAC7D,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,KAAK,CAAC,IAAI,IAAI;EACpE;EAEA,MAAM,aAAa,OAAa;AAC9B,WAAO,KAAK,OAAO,GAAG,KAAK,WAAU,CAAE,YAAY,IAAI,KAAK,CAAC,EAAE;EACjE;;;;EAMA,MAAM,aAAa,QAA+B;AAChD,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,eAAe,MAAM;EAC3D;EAEA,MAAM,YAAY,QAA+B;AAC/C,WAAO,KAAK,IAAI,GAAG,KAAK,WAAU,CAAE,cAAc,MAAM;EAC1D;;;;EAMA,MAAM,QAAK;AACT,WAAO,KAAK,IAAI,QAAQ;EAC1B;;;;EAMA,MAAM,IAAIA,OAAc,QAA+B;AACrD,QAAI,MAAM,GAAG,KAAK,OAAO,GAAGA,KAAI;AAChC,QAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,aAAO,MAAM,IAAI,gBAAgB,MAAM,EAAE,SAAQ;IACnD;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG;EAChC;EAEA,MAAM,KAAKA,OAAc,MAA8B;AACrD,WAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK,OAAO,GAAGA,KAAI,IAAI,IAAI;EAC5D;EAEA,MAAM,IAAIA,OAAc,MAA8B;AACpD,WAAO,KAAK,QAAQ,OAAO,GAAG,KAAK,OAAO,GAAGA,KAAI,IAAI,IAAI;EAC3D;EAEA,MAAM,OAAOA,OAAc,MAA8B;AACvD,WAAO,KAAK,QAAQ,UAAU,GAAG,KAAK,OAAO,GAAGA,KAAI,IAAI,IAAI;EAC9D;EAEQ,MAAM,QAAQ,QAAgB,KAAa,MAA8B;AAC/E,UAAM,UAAkC;MACtC,iBAAiB,UAAU,KAAK,MAAM;MACtC,UAAU;;AAGZ,UAAM,OAAoB;MACxB;MACA;MACA,QAAQ,YAAY,QAAQ,kBAAkB;;AAGhD,QAAI,QAAQ,WAAW,OAAO;AAC5B,cAAQ,cAAc,IAAI;AAC1B,WAAK,OAAO,KAAK,UAAU,IAAI;IACjC;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,CAAC,QAAgB,QAAQ,OAAO,MAAM,WAAW,GAAG;CAAI;AACpE,UAAI,GAAG,MAAM,IAAI,GAAG,EAAE;AACtB,UAAI,KAAK;AAAM,YAAI,SAAS,KAAK,IAAc,EAAE;IACnD;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK,IAAI;IAClC,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,mCAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;IAC9E;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,CAAC,QAAgB,QAAQ,OAAO,MAAM,WAAW,GAAG;CAAI;AACpE,UAAI,QAAQ,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AACpD,YAAM,eAAe,CAAC,qBAAqB,yBAAyB,qBAAqB,sBAAsB,0BAA0B,cAAc;AACvJ,iBAAW,KAAK,cAAc;AAC5B,cAAM,IAAI,SAAS,QAAQ,IAAI,CAAC;AAChC,YAAI,MAAM;AAAM,cAAI,KAAK,CAAC,KAAK,CAAC,EAAE;MACpC;IACF;AAEA,UAAM,kBAAkB,SAAS,QAAQ,IAAI,mBAAmB;AAChE,QAAI,iBAAiB;AACnB,WAAK,gBAAgB;QACnB,OAAO,SAAS,iBAAiB,EAAE;QACnC,WAAW,SAAS,SAAS,QAAQ,IAAI,uBAAuB,KAAK,KAAK,EAAE;QAC5E,OAAO,SAAS,SAAS,QAAQ,IAAI,mBAAmB,KAAK,KAAK,EAAE;;IAExE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAI;AAChC,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;IACxB,QAAQ;AACN,UAAI,KAAK,OAAO;AACd,gBAAQ,OAAO,MAAM,yBAAyB,KAAK,UAAU,GAAG,GAAG,CAAC;CAAI;MAC1E;AACA,YAAM,IAAI,SAAS,8BAA8B,SAAS,MAAM,KAAK,SAAS,QAAQ,eAAe,CAAA,CAAE;IACzG;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM;AACZ,YAAM,YAAY,KAAK,OAAO,QAAQ;AACtC,YAAM,eAAe,KAAK,OAAO,WAAW;AAC5C,YAAM,SAAS,KAAK,OAAO,UAAU,CAAA;AACrC,YAAM,IAAI,SAAS,cAAc,SAAS,QAAQ,WAAW,MAAM;IACrE;AAEA,WAAO;EACT;;AAGF,SAAS,IAAI,GAAS;AACpB,SAAO,mBAAmB,CAAC;AAC7B;;;AChdA,SAAS,gBAAgB;;;ACDzB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAIf,SAAS,aAAa,OAAkB;AACtC,QAAM,OAAO,GAAG,QAAO;AACvB,SAAO,KAAK,KAAK,MAAM,WAAW,MAAM,SAAS;AACnD;AAEA,SAAS,cAAc,OAAkB;AACvC,SAAO,KAAK,KAAK,aAAa,KAAK,GAAG,aAAa;AACrD;AAEM,SAAU,WAAW,OAAkB;AAC3C,QAAM,aAAa,cAAc,KAAK;AACtC,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,WAAO,EAAE,gBAAgB,WAAW,UAAU,CAAA,EAAE;EAClD;AACA,QAAM,MAAM,GAAG,aAAa,YAAY,OAAO;AAC/C,SAAO,KAAK,MAAM,GAAG;AACvB;AAEM,SAAU,WAAW,OAAoB,QAAiB;AAC9D,QAAM,YAAY,aAAa,KAAK;AACpC,KAAG,UAAU,WAAW,EAAE,WAAW,KAAI,CAAE;AAC3C,QAAM,aAAa,cAAc,KAAK;AACtC,KAAG,cAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC9E;AAEM,SAAU,iBAAiB,OAAoB,aAAoB;AACvE,QAAM,YAAY,MAAM,MAAM,YAAW;AACzC,QAAM,YAAY,QAAQ,IAAI,GAAG,SAAS,UAAU,KAAK,QAAQ,IAAI,iBAAiB;AACtF,QAAM,gBAAgB,QAAQ,IAAI,GAAG,SAAS,aAAa,KAAK,QAAQ,IAAI,oBAAoB;AAEhG,MAAI,WAAW;AACb,WAAO;MACL,QAAQ;MACR,YAAY;;EAEhB;AAEA,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,OAAO,eAAe,OAAO,kBAAkB;AACrD,SAAO,OAAO,SAAS,IAAI,KAAK;AAClC;;;AC7CA,SAAS,eAAe;;;ACClB,SAAU,aAAa,MAAe,QAAoB;AAC9D,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;EACrC;AACA,SAAO,YAAY,IAAI;AACzB;AAEA,SAAS,YAAY,MAAa;AAChC,MAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,WAAO;EACT;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,iBAAiB,IAAiC;EAC3D;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,MAAM;AACZ,UAAM,aAAa,OAAO,QAAQ,GAAG,EAAE,KACrC,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,KAAM,OAAO,EAAE,CAAC,MAAM,YAAY,EAAE,CAAC,MAAM,KAAM;AAEhG,QAAI,YAAY;AACd,YAAM,gBAAgB,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,WAAW,CAAC,CAAC;AAC7E,YAAM,QAAkB,CAAA;AACxB,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,KAAK,oBAAoB,OAAO,YAAY,aAAa,CAAC,CAAC;AACjE,cAAM,KAAK,EAAE;MACf;AACA,YAAM,KAAK,iBAAiB,WAAW,CAAC,CAA8B,CAAC;AACvE,aAAO,MAAM,KAAK,IAAI;IACxB;AACA,WAAO,oBAAoB,GAAG;EAChC;AAEA,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,oBAAoB,KAA4B;AACvD,QAAM,UAAU,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;IACzD;IACA,OAAO,YAAY,KAAK;IACxB;AAEF,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAK,aAAa,EAAE,GAAG,CAAC,CAAC;AACnE,QAAM,QAAQ,QAAQ,IAAI,OAAK,GAAG,SAAS,EAAE,KAAK,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE;AAC1E,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,iBAAiB,OAAgC;AACxD,MAAI,MAAM,WAAW;AAAG,WAAO;AAE/B,QAAM,OAAO,OAAO,KAAK,MAAM,CAAC,CAAE;AAElC,QAAM,YAAY,KAAK,IAAI,SAAM;AAC/B,UAAM,cAAc,aAAa,GAAG;AACpC,UAAM,eAAe,KAAK,IACxB,GAAG,MAAM,IAAI,UAAQ,aAAa,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5D,WAAO,KAAK,IAAI,aAAa,YAAY;EAC3C,CAAC;AAED,QAAM,SAAS,KAAK,IAAI,CAAC,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,CAAE,CAAC,EAAE,KAAK,IAAI;AAC3E,QAAM,YAAY,UAAU,IAAI,OAAK,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC7D,QAAM,OAAO,MAAM,IAAI,UACrB,KAAK,IAAI,CAAC,KAAK,MAAM,SAAS,YAAY,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,CAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAGlF,SAAO,CAAC,QAAQ,WAAW,GAAG,IAAI,EAAE,KAAK,IAAI;AAC/C;AAEA,SAAS,YAAY,OAAc;AACjC,MAAI,UAAU,QAAQ,UAAU;AAAW,WAAO;AAClD,MAAI,OAAO,UAAU;AAAU,WAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,aAAa,KAAW;AAC/B,MAAI,QAAQ;AACZ,aAAW,QAAQ,KAAK;AACtB,UAAM,OAAO,KAAK,YAAY,CAAC;AAC/B,QACG,QAAQ,QAAU,QAAQ,QAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,UAAW,QAAQ,UAC3B,QAAQ,UAAW,QAAQ,QAC5B;AACA,eAAS;IACX,OAAO;AACL,eAAS;IACX;EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,KAAa,aAAmB;AAChD,QAAM,eAAe,aAAa,GAAG;AACrC,QAAM,UAAU,KAAK,IAAI,GAAG,cAAc,YAAY;AACtD,SAAO,MAAM,IAAI,OAAO,OAAO;AACjC;;;ADnGA,SAAS,SAAS,KAAY;AAC5B,MAAI,OAAO;AACX,SAAO,KAAK;AAAQ,WAAO,KAAK;AAChC,SAAO;AACT;AAEM,SAAU,cAAc,KAAc,OAAkB;AAC5D,QAAM,OAAO,SAAS,GAAG;AACzB,QAAM,WAAW,KAAK,KAAI;AAC1B,QAAM,UAAU,iBAAiB,OAAO,SAAS,OAAiB;AAClE,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,mFAAkB,MAAM,WAAW,4EAA0B;AAC3E,YAAQ,KAAK,CAAC;EAChB;AAEA,QAAM,QAAQ,CAAC,EAAE,SAAS,SAAS,QAAQ,IAAI,kBAAkB;AACjE,QAAM,aAAa,kBAAkB,GAAG,KAAK,QAAQ;AACrD,SAAO,IAAI,UAAU;IACnB,QAAQ,QAAQ;IAChB,SAAS,MAAM;IACf;IACA;GACD;AACH;AAEA,SAAS,kBAAkB,KAAY;AACrC,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,UAAM,MAAM,QAAQ,KAAI,GAAI;AAC5B,QAAI;AAAK,aAAO;AAChB,cAAU,QAAQ;EACpB;AACA,SAAO;AACT;AAEM,SAAU,UAAU,KAAY;AACpC,QAAM,OAAO,SAAS,GAAG;AACzB,SAAQ,KAAK,KAAI,EAAG,UAA2B;AACjD;AAEM,SAAU,YAAY,MAAe,QAAoB;AAC7D,UAAQ,IAAI,aAAa,MAAM,MAAM,CAAC;AACxC;AAEA,eAAsB,yBAAyB,KAAc,SAAe;AAC1E,QAAM,OAAO,SAAS,GAAG;AACzB,MAAI,KAAK,KAAI,EAAG,OAAO,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ,KAAK,SAAS,IAAI;AAAG;AAEtF,QAAM,KAAK,MAAM,QAAQ,EAAE,SAAS,SAAS,MAAK,CAAE;AACpD,MAAI,CAAC,IAAI;AACP,YAAQ,MAAM,wDAAW;AACzB,YAAQ,KAAK,CAAC;EAChB;AACF;AAEM,SAAU,YAAY,KAA4B;AACtD,QAAM,SAAkC,CAAA;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU;AAAW,aAAO,GAAG,IAAI;EACzC;AACA,SAAO;AACT;;;AF7DA,SAAS,WAAW,QAAc;AAChC,SAAO,GAAG,OAAO,UAAU,GAAG,CAAC,CAAC;AAClC;AAEM,SAAU,qBAAqB,SAAkB,OAAkB;AACvE,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,0BAAM;AAErB,OACG,QAAQ,OAAO,EACf,YAAY,2GAAsB,EAClC,OAAO,mBAAmB,iBAAO,EACjC,OAAO,uBAAuB,4FAAiB,EAC/C,OAAO,OAAO,MAAgD,QAAgB;AAC7E,UAAM,cAAuB,IAAI,gBAAe,EAAG,WAAkC;AACrF,QAAI,SAAS,KAAK;AAClB,QAAI,aAAa,KAAK;AAEtB,QAAI,CAAC,QAAQ;AACX,eAAS,MAAM,SAAS,EAAE,SAAS,sCAAa,MAAM,KAAI,CAAE;IAC9D;AACA,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,mEAAiB;AAC/B,cAAQ,KAAK,CAAC;IAChB;AAEA,YAAQ,MAAM,qDAAa;AAC3B,UAAM,SAAS,IAAI,UAAU,EAAE,QAAQ,SAAS,MAAM,QAAO,CAAE;AAC/D,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,OAAO,MAAK;IAC7B,SAAS,KAAK;AACZ,UAAI,eAAe,YAAY,IAAI,cAAc,gBAAgB;AAC/D,gBAAQ,MAAM,sKAAoC;AAClD,gBAAQ,KAAK,CAAC;MAChB;AACA,YAAM;IACR;AACA,YAAQ,MAAM,+DAAa;AAE3B,QAAI,CAAC,cAAc,OAAO,YAAY;AACpC,mBAAa,OAAO;AACpB,cAAQ,MAAM,2FAAqB,UAAU,EAAE;IACjD;AAEA,UAAM,SAAS,WAAW,KAAK;AAC/B,WAAO,SAAS,WAAW,IAAI;MAC7B;MACA,GAAI,aAAa,EAAE,WAAU,IAAK,CAAA;;AAEpC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,aAAO,iBAAiB;IAC1B;AACA,eAAW,OAAO,MAAM;AAExB,YAAQ,MAAM,gDAAa,WAAW,8CAAW;AACjD,YAAQ,MAAM,qDAAuB,MAAM,SAAS,cAAc;EACpE,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,8DAAY,EACxB,OAAO,CAAC,OAAgC,QAAgB;AACvD,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,SAAS,WAAW,KAAK;AAC/B,UAAM,cAAe,IAAI,gBAAe,EAAG,WAAkC,OAAO,kBAAkB;AACtG,UAAM,UAAU,OAAO,SAAS,WAAW;AAE3C,QAAI,CAAC,SAAS;AACZ,UAAI,WAAW,QAAQ;AACrB,oBAAY;UACV,eAAe;UACf,SAAS;UACT,SAAS,yCAAW,WAAW;WAC9B,MAAM;MACX,OAAO;AACL,gBAAQ,MAAM,yCAAW,WAAW,oDAAY;AAChD,gBAAQ,MAAM,KAAK,MAAM,WAAW,8FAA6B;MACnE;AACA,cAAQ,KAAK,CAAC;IAChB;AAEA,QAAI,WAAW,QAAQ;AACrB,kBAAY;QACV,eAAe;QACf,SAAS;QACT,SAAS,WAAW,QAAQ,MAAM;QAClC,YAAY,QAAQ,cAAc;QAClC,UAAU,MAAM;SACf,MAAM;AACT;IACF;AAEA,YAAQ,IAAI,yCAAW,WAAW,EAAE;AACpC,YAAQ,IAAI,wBAAc,WAAW,QAAQ,MAAM,CAAC,EAAE;AACtD,QAAI,QAAQ,YAAY;AACtB,cAAQ,IAAI,qCAAY,QAAQ,UAAU,EAAE;IAC9C;AACA,YAAQ,IAAI,kDAAe,MAAM,OAAO,EAAE;EAC5C,CAAC;AAEH,OACG,QAAQ,UAAU,EAClB,YAAY,oEAAa,EACzB,OAAO,CAAC,OAAgC,QAAgB;AACvD,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,SAAS,WAAW,KAAK;AAC/B,UAAM,WAAW,OAAO,KAAK,OAAO,QAAQ;AAE5C,QAAI,SAAS,WAAW,GAAG;AACzB,UAAI,WAAW,QAAQ;AACrB,oBAAY;UACV,iBAAiB,OAAO,kBAAkB;UAC1C,UAAU,CAAA;UACV,SAAS;WACR,MAAM;MACX,OAAO;AACL,gBAAQ,MAAM,sFAAgB;AAC9B,gBAAQ,MAAM,KAAK,MAAM,WAAW,8FAA6B;MACnE;AACA,cAAQ,KAAK,CAAC;IAChB;AAEA,UAAM,OAAO,SAAS,IAAI,CAAC,SAAQ;AACjC,YAAM,IAAI,OAAO,SAAS,IAAI;AAC9B,aAAO;QACL;QACA,SAAS,SAAS,OAAO;QACzB,SAAS,WAAW,EAAE,MAAM;QAC5B,YAAY,EAAE,cAAc;;IAEhC,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,kBAAY;QACV,iBAAiB,OAAO,kBAAkB;QAC1C,UAAU;SACT,MAAM;AACT;IACF;AAEA,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,SAAS,OAAO,iBAAiB,eAAe;AAC/D,YAAM,IAAI,OAAO,SAAS,IAAI;AAC9B,YAAM,MAAM,WAAW,EAAE,MAAM;AAC/B,YAAM,KAAK,EAAE,aAAa,eAAe,EAAE,UAAU,KAAK;AAC1D,cAAQ,IAAI,GAAG,IAAI,GAAG,MAAM,SAAS,GAAG,GAAG,EAAE,EAAE;IACjD;EACF,CAAC;AACL;;;AIzJM,SAAU,2BAA2B,QAAiB,OAAkB;AAC5E,SACG,QAAQ,MAAM,EACd,YAAY,wDAAW,EACvB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,cAAa,GAAI,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,oEAAa,EACzB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,eAAc,GAAI,UAAU,MAAM,CAAC;EAC9D,CAAC;AACL;;;AChBM,SAAU,qBAAqB,QAAiB,OAAkB;AACtE,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,kBAAQ;AAEvB,OACG,QAAQ,MAAM,EACd,YAAY,oCAAW,EACvB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,SAAQ,GAAI,UAAU,MAAM,CAAC;EACxD,CAAC;AAEH,OACG,QAAQ,KAAK,EACb,YAAY,oCAAW,EACvB,eAAe,oBAAoB,qCAAiB,EACpD,eAAe,kBAAkB,qCAAiB,EAClD,eAAe,qBAAqB,sCAAQ,EAC5C,OAAO,iBAAiB,UAAK,GAAG,EAChC,OAAO,mBAAmB,UAAK,GAAG,EAClC,OAAO,qBAAqB,gBAAM,GAAG,EACrC,OAAO,qBAAqB,cAAI,EAChC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,QAAQ,KAAK;MAAQ,MAAM,KAAK;MAAM,KAAK,KAAK;MAChD,OAAO,KAAK;MAAO,SAAS,KAAK;MAAS,SAAS,KAAK;MACxD,SAAS,KAAK;KACf;AACD,gBAAY,MAAM,OAAO,QAAQ,IAAI,GAAG,UAAU,MAAM,CAAC;EAC3D,CAAC;AAEH,OACG,QAAQ,iBAAiB,EACzB,YAAY,wBAAS,EACrB,OAAO,oBAAoB,QAAG,EAC9B,OAAO,kBAAkB,QAAG,EAC5B,OAAO,iBAAiB,QAAG,EAC3B,OAAO,mBAAmB,QAAG,EAC7B,OAAO,qBAAqB,cAAI,EAChC,OAAO,qBAAqB,sCAAQ,EACpC,OAAO,qBAAqB,cAAI,EAChC,OAAO,qBAAqB,wCAAoB,EAChD,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,QAAQ,KAAK;MAAQ,MAAM,KAAK;MAAM,KAAK,KAAK;MAChD,OAAO,KAAK;MAAO,SAAS,KAAK;MAAS,SAAS,KAAK;MACxD,SAAS,KAAK;KACf;AACD,QAAI,KAAK,YAAY;AAAW,WAAK,UAAU,KAAK,YAAY;AAChE,gBAAY,MAAM,OAAO,WAAW,QAAQ,IAAI,GAAG,UAAU,MAAM,CAAC;EACtE,CAAC;AAEH,OACG,QAAQ,iBAAiB,EACzB,YAAY,wBAAS,EACrB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,WAAkB;AAC/B,UAAM,yBAAyB,QAAQ,SAAS,MAAM,8FAAmB;AACzE,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAW,MAAM,GAAG,UAAU,MAAM,CAAC;EAChE,CAAC;AACL;;;AChEM,SAAU,mBAAmB,QAAiB,OAAkB;AACpE,QAAM,KAAK,OACR,QAAQ,IAAI,EACZ,YAAY,2DAAmB;AAElC,KACG,QAAQ,MAAM,EACd,YAAY,yCAAgB,EAC5B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,cAAc,MAAM,GAAG,UAAU,MAAM,CAAC;EACnE,CAAC;AAEH,KACG,QAAQ,KAAK,EACb,YAAY,iEAAoB,EAChC,eAAe,eAAe,mFAAiC,EAC/D,eAAe,mBAAmB,4CAAS,EAC3C,eAAe,+BAA+B,kDAAU,EACxD,eAAe,+BAA+B,kDAAU,EACxD,eAAe,yBAAyB,8DAAY,EACpD,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,KAAK,KAAK;MAAK,OAAO,KAAK;MAC3B,gBAAgB,KAAK;MAAe,gBAAgB,KAAK;MACzD,aAAa,KAAK;MAAY,MAAM,KAAK;KAC1C;AACD,gBAAY,MAAM,OAAO,aAAa,IAAI,GAAG,UAAU,MAAM,CAAC;EAChE,CAAC;AAEH,KACG,QAAQ,eAAe,EACvB,YAAY,yCAAgB,EAC5B,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,MAAc,SAAQ;AACnC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,gBAAgB,MAAM,YAAY,EAAE,MAAM,KAAK,KAAI,CAAE,CAAC,GAAG,UAAU,MAAM,CAAC;EACrG,CAAC;AAEH,KACG,QAAQ,eAAe,EACvB,YAAY,6BAAc,EAC1B,OAAO,uBAAuB,uJAAoC,EAClE,OAAO,4BAA4B,4IAAmC,EACtE,OAAO,yBAAyB,gJAAkC,EAClE,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,MAAc,SAAQ;AACnC,UAAM,yBAAyB,QAAQ,cAAc,IAAI,8FAAmB;AAC5E,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,WAAW,KAAK,aAAa,SAAY,KAAK,aAAa,SAAS;MACpE,gBAAgB,KAAK,iBAAiB,SAAY,KAAK,iBAAiB,SAAS;MACjF,aAAa,KAAK,eAAe,SAAY,KAAK,eAAe,SAAS;KAC3E;AACD,gBAAY,MAAM,OAAO,gBAAgB,MAAM,IAAI,GAAG,UAAU,MAAM,CAAC;EACzE,CAAC;AACL;;;AC7DM,SAAU,qBAAqB,QAAiB,OAAkB;AACtE,QAAM,OAAO,OACV,QAAQ,MAAM,EACd,YAAY,8DAAY;AAE3B,OACG,QAAQ,MAAM,EACd,YAAY,gFAAe,EAC3B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,SAAS,MAAM,GAAG,UAAU,MAAM,CAAC;EAC9D,CAAC;AAEH,OACG,QAAQ,mBAAmB,EAC3B,YAAY,gFAAe,EAC3B,OAAO,OAAO,gBAAuB;AACpC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,QAAQ,WAAW,GAAG,UAAU,MAAM,CAAC;EAClE,CAAC;AAEH,OACG,QAAQ,mBAAmB,EAC3B,YAAY,gFAAe,EAC3B,eAAe,yBAAyB,gCAAO,EAC/C,OAAO,mBAAmB,4BAAQ,EAClC,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,aAAqB,SAAQ;AAC1C,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,cAAc;MAAa,UAAU,KAAK;MAC1C,UAAU,KAAK,YAAY,SAAY,SAAS,KAAK,SAAS,EAAE,IAAI;MACpE,MAAM,KAAK;KACZ;AACD,gBAAY,MAAM,OAAO,QAAQ,IAAI,GAAG,UAAU,MAAM,CAAC;EAC3D,CAAC;AAEH,OACG,QAAQ,sBAAsB,EAC9B,YAAY,gFAAe,EAC3B,OAAO,yBAAyB,gCAAO,EACvC,OAAO,mBAAmB,4BAAQ,EAClC,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,aAAqB,SAAQ;AAC1C,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAW,aAAa,YAAY;MAC3D,UAAU,KAAK;MACf,UAAU,KAAK,YAAY,SAAY,SAAS,KAAK,SAAS,EAAE,IAAI;MACpE,MAAM,KAAK;KACZ,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,OACG,QAAQ,sBAAsB,EAC9B,YAAY,oEAAa,EACzB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,gBAAuB;AACpC,UAAM,yBAAyB,QAAQ,qDAAa,WAAW,8FAAmB;AAClF,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAW,WAAW,GAAG,UAAU,MAAM,CAAC;EACrE,CAAC;AAEH,OACG,QAAQ,8BAA8B,EACtC,YAAY,8DAAY,EACxB,OAAO,OAAO,gBAAuB;AACpC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,kBAAkB,WAAW,GAAG,UAAU,MAAM,CAAC;EAC5E,CAAC;AAEH,OACG,QAAQ,iCAAiC,EACzC,YAAY,8DAAY,EACxB,OAAO,sCAAsC,4FAAiB,EAC9D,OAAO,6BAA6B,kHAA6B,EACjE,OAAO,OAAO,aAAqB,SAAQ;AAC1C,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,CAAA;AACtC,QAAI,KAAK;AAAqB,WAAK,uBAAuB,KAAK,oBAAoB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAI,CAAE;AACzH,QAAI,KAAK,kBAAkB;AAAW,WAAK,kBAAkB,KAAK,kBAAkB;AACpF,gBAAY,MAAM,OAAO,qBAAqB,aAAa,IAAI,GAAG,UAAU,MAAM,CAAC;EACrF,CAAC;AACL;;;ACrFM,SAAU,2BAA2B,QAAiB,OAAkB;AAC5E,QAAM,aAAa,OAChB,QAAQ,aAAa,EACrB,YAAY,wDAAW;AAE1B,aACG,QAAQ,MAAM,EACd,YAAY,4FAAiB,EAC7B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,eAAe,MAAM,GAAG,UAAU,MAAM,CAAC;EACpE,CAAC;AAEH,aACG,QAAQ,KAAK,EACb,YAAY,sFAAgB,EAC5B,eAAe,qBAAqB,sCAAQ,EAC5C,eAAe,iCAAiC,4CAAS,EACzD,eAAe,6BAA6B,yEAA2C,EACvF,OAAO,iCAAiC,+GAAmD,EAC3F,eAAe,wBAAwB,mGAAsD,EAC7F,OAAO,4BAA4B,yHAAyC,EAC5E,OAAO,4BAA4B,2FAA+B,EAClE,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC;MACpC,QAAQ,KAAK;MACb,YAAY,CAAC;QACX,SAAS,KAAK;QACd,OAAO,KAAK;QACZ,YAAY,KAAK,sBAAsB;OACxC;MACD,QAAQ;QACN,MAAM,KAAK;QACX,QAAQ,KAAK,gBAAgB;QAC7B,QAAQ,KAAK,gBAAgB;;;AAGjC,gBAAY,MAAM,OAAO,cAAc,IAAI,GAAG,UAAU,MAAM,CAAC;EACjE,CAAC;AAEH,aACG,QAAQ,mBAAmB,EAC3B,YAAY,0EAAc,EAC1B,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,aAAoB;AACjC,UAAM,yBAAyB,QAAQ,2DAAc,QAAQ,8FAAmB;AAChF,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,iBAAiB,QAAQ,GAAG,UAAU,MAAM,CAAC;EACxE,CAAC;AACL;;;ACrDM,SAAU,oBAAoB,QAAiB,OAAkB;AACrE,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,+CAAY;AAE3B,MACG,QAAQ,MAAM,EACd,YAAY,iEAAe,EAC3B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,QAAQ,MAAM,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,MACG,QAAQ,kBAAkB,EAC1B,YAAY,iEAAe,EAC3B,eAAe,yBAAyB,gCAAO,EAC/C,OAAO,qBAAqB,sCAAQ,EACpC,OAAO,gBAAgB,uEAAgB,EACvC,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAO,YAAY;MACvB,aAAa;MAAY,UAAU,KAAK;MACxC,WAAW,KAAK;MAAW,UAAU,KAAK,UAAU,SAAY,SAAS,KAAK,OAAO,EAAE,IAAI;MAC3F,MAAM,KAAK;KACZ;AACD,gBAAY,MAAM,OAAO,OAAO,IAAI,GAAG,UAAU,MAAM,CAAC;EAC1D,CAAC;AAEH,MACG,QAAQ,qBAAqB,EAC7B,YAAY,iEAAe,EAC3B,OAAO,yBAAyB,gCAAO,EACvC,OAAO,qBAAqB,sCAAQ,EACpC,OAAO,gBAAgB,wCAAU,EACjC,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,YAAY,YAAY;MACzD,UAAU,KAAK;MAAU,WAAW,KAAK;MACzC,UAAU,KAAK,UAAU,SAAY,SAAS,KAAK,OAAO,EAAE,IAAI;MAChE,MAAM,KAAK;KACZ,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,MACG,QAAQ,qBAAqB,EAC7B,YAAY,qDAAa,EACzB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,eAAsB;AACnC,UAAM,yBAAyB,QAAQ,sCAAa,UAAU,8FAAmB;AACjF,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,UAAU,GAAG,UAAU,MAAM,CAAC;EACnE,CAAC;AACL;;;AC1DM,SAAU,mBAAmB,QAAiB,OAAkB;AACpE,QAAM,KAAK,OACR,QAAQ,IAAI,EACZ,YAAY,mBAAS;AAExB,KACG,QAAQ,MAAM,EACd,YAAY,oEAAa,EACzB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,OAAM,GAAI,UAAU,MAAM,CAAC;EACtD,CAAC;AAEH,KACG,QAAQ,kBAAkB,EAC1B,YAAY,oEAAa,EACzB,OAAO,6BAA6B,sIAAqE,EACzG,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,MAAM,YAAY;MACzC,aAAa;MAAY,eAAe,KAAK;MAAc,MAAM,KAAK;KACvE,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,KACG,QAAQ,iBAAiB,EACzB,YAAY,0EAAc,EAC1B,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,SAAS,QAAQ,YAAY;MACpD,MAAM,KAAK;KACZ,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,KACG,QAAQ,iBAAiB,EACzB,YAAY,wDAAW,EACvB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,WAAkB;AAC/B,UAAM,yBAAyB,QAAQ,yCAAW,MAAM,8FAAmB;AAC3E,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,SAAS,MAAM,GAAG,UAAU,MAAM,CAAC;EAC9D,CAAC;AAEH,KACG,QAAQ,WAAW,EACnB,YAAY,6DAAgB,EAC5B,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAU,GAAI,UAAU,MAAM,CAAC;EAC1D,CAAC;AAEH,KACG,QAAQ,uBAAuB,EAC/B,YAAY,6DAAgB,EAC5B,eAAe,yBAAyB,gCAAO,EAC/C,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,YAAY;MAC7C,aAAa;MAAY,UAAU,KAAK;MAAU,MAAM,KAAK;KAC9D,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,KACG,QAAQ,sBAAsB,EAC9B,YAAY,6DAAgB,EAC5B,OAAO,yBAAyB,gCAAO,EACvC,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,QAAQ,YAAY;MACxD,UAAU,KAAK;MAAU,MAAM,KAAK;KACrC,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,KACG,QAAQ,sBAAsB,EAC9B,YAAY,iDAAc,EAC1B,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,WAAkB;AAC/B,UAAM,yBAAyB,QAAQ,kCAAc,MAAM,8FAAmB;AAC9E,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,MAAM,GAAG,UAAU,MAAM,CAAC;EAClE,CAAC;AAEH,KACG,QAAQ,qBAAqB,EAC7B,YAAY,+EAAmB,EAC/B,OAAO,OAAO,WAAkB;AAC/B,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,gBAAgB,MAAM,GAAG,UAAU,MAAM,CAAC;EACrE,CAAC;AAEH,KACG,QAAQ,oBAAoB,EAC5B,YAAY,mEAAiB,EAC7B,eAAe,sBAAsB,wDAAW,EAChD,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,eAAe,QAAQ,EAAE,SAAS,KAAK,OAAM,CAAE,GAAG,UAAU,MAAM,CAAC;EAC9F,CAAC;AAEH,KACG,QAAQ,uBAAuB,EAC/B,YAAY,mEAAiB,EAC7B,eAAe,sBAAsB,wDAAW,EAChD,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,yBAAyB,QAAQ,kCAAc,MAAM,iDAAc,KAAK,MAAM,sHAAuB;AAC3G,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,kBAAkB,QAAQ,EAAE,SAAS,KAAK,OAAM,CAAE,GAAG,UAAU,MAAM,CAAC;EACjG,CAAC;AACL;;;ACnHM,SAAU,2BAA2B,QAAiB,OAAkB;AAC5E,QAAM,SAAS,OACZ,QAAQ,aAAa,EACrB,YAAY,+CAAY;AAE3B,SACG,QAAQ,KAAK,EACb,YAAY,+CAAY,EACxB,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,cAAc,MAAM,GAAG,UAAU,MAAM,CAAC;EACnE,CAAC;AAEH,SACG,QAAQ,iBAAiB,EACzB,YAAY,qDAAa,EACzB,eAAe,mBAAmB,0DAAkB,EACpD,OAAO,OAAO,QAAgB,SAAQ;AACrC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,iBAAiB,QAAQ,EAAE,SAAS,KAAK,IAAG,CAAE,GAAG,UAAU,MAAM,CAAC;EAC7F,CAAC;AACL;;;ACxBM,SAAU,6BAA6B,QAAiB,OAAkB;AAC9E,QAAM,SAAS,OACZ,QAAQ,QAAQ,EAChB,YAAY,sCAAQ;AAEvB,SACG,QAAQ,MAAM,EACd,YAAY,oEAAa,EACzB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAU,GAAI,UAAU,MAAM,CAAC;EAC1D,CAAC;AAEH,SACG,QAAQ,cAAc,EACtB,YAAY,oEAAa,EACzB,OAAO,OAAO,eAAsB;AACnC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,UAAU,GAAG,UAAU,MAAM,CAAC;EACnE,CAAC;AAEH,SACG,QAAQ,cAAc,EACtB,YAAY,oEAAa,EACzB,OAAO,iBAAiB,iEAAoB,EAC5C,OAAO,4BAA4B,sGAA2B,EAC9D,OAAO,8BAA8B,0GAA0B,EAC/D,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,EAAE,QAAQ,WAAU;AAC1D,QAAI,KAAK,QAAQ;AAAW,WAAK,MAAM,KAAK,QAAQ;AACpD,QAAI,KAAK,kBAAkB;AAAW,WAAK,iBAAiB,KAAK,kBAAkB;AACnF,QAAI,KAAK,mBAAmB;AAAW,WAAK,2BAA2B,KAAK,mBAAmB;AAC/F,QAAI,KAAK,SAAS;AAAW,WAAK,OAAO,KAAK;AAC9C,gBAAY,MAAM,OAAO,UAAU,IAAI,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,SACG,QAAQ,iBAAiB,EACzB,YAAY,wDAAW,EACvB,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,YAAY,YAAY;MAC5D,MAAM,KAAK;KACZ,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,SACG,QAAQ,iBAAiB,EACzB,YAAY,wDAAW,EACvB,OAAO,kBAAkB,kJAA0B,EACnD,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,SAAS,KAAK,cAAc,yFAAmB;AACrD,UAAM,yBAAyB,QAAQ,yCAAW,UAAU,yCAAW,MAAM,wDAAW;AACxF,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,CAAA;AACtC,QAAI,KAAK;AAAa,WAAK,eAAe;AAC1C,gBAAY,MAAM,OAAO,aAAa,YAAY,IAAI,GAAG,UAAU,MAAM,CAAC;EAC5E,CAAC;AAEH,SACG,QAAQ,gBAAgB,EACxB,YAAY,8DAAY,EACxB,eAAe,iBAAiB,2IAAiD,EACjF,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,YAAoB,SAAQ;AACzC,UAAM,yBAAyB,QAAQ,yCAAW,UAAU,aAAQ,KAAK,IAAI,oGAAoB;AACjG,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,YAAY,YAAY,EAAE,MAAM,KAAK,KAAI,CAAE,GAAG,UAAU,MAAM,CAAC;EAC1F,CAAC;AACL;;;ACzEM,SAAU,0BAA0B,QAAiB,OAAkB;AAC3E,QAAM,YAAY,OACf,QAAQ,WAAW,EACnB,YAAY,kDAAU;AAEzB,YACG,QAAQ,MAAM,EACd,YAAY,gFAAe,EAC3B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,cAAc,MAAM,GAAG,UAAU,MAAM,CAAC;EACnE,CAAC;AAEH,YACG,QAAQ,iBAAiB,EACzB,YAAY,oEAAa,EACzB,OAAO,+BAA+B,8JAA6F,EACnI,OAAO,iBAAiB,iEAAoB,EAC5C,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,eAAuB,SAAQ;AAC5C,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,EAAE,WAAW,cAAa;AAChE,QAAI,KAAK,qBAAqB;AAAW,WAAK,qBAAqB,KAAK;AACxE,QAAI,KAAK,QAAQ;AAAW,WAAK,MAAM,KAAK,QAAQ;AACpD,QAAI,KAAK,SAAS;AAAW,WAAK,OAAO,KAAK;AAC9C,gBAAY,MAAM,OAAO,aAAa,IAAI,GAAG,UAAU,MAAM,CAAC;EAChE,CAAC;AAEH,YACG,QAAQ,oBAAoB,EAC5B,YAAY,0EAAc,EAC1B,OAAO,kBAAkB,cAAI,EAC7B,OAAO,OAAO,eAAuB,SAAQ;AAC5C,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,gBAAgB,eAAe,YAAY;MAClE,MAAM,KAAK;KACZ,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,YACG,QAAQ,oBAAoB,EAC5B,YAAY,wDAAW,EACvB,OAAO,kBAAkB,oEAAa,EACtC,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,eAAuB,SAAQ;AAC5C,UAAM,SAAS,KAAK,cAAc,yFAAmB;AACrD,UAAM,yBAAyB,QAAQ,yCAAW,aAAa,yCAAW,MAAM,wDAAW;AAC3F,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,CAAA;AACtC,QAAI,KAAK;AAAa,WAAK,eAAe;AAC1C,gBAAY,MAAM,OAAO,gBAAgB,eAAe,IAAI,GAAG,UAAU,MAAM,CAAC;EAClF,CAAC;AACL;;;ACvDM,SAAU,oBAAoB,QAAiB,OAAkB;AACrE,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,iBAAO;AAEtB,MACG,QAAQ,MAAM,EACd,YAAY,qDAAa,EACzB,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,QAAQ,MAAM,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,MACG,QAAQ,sBAAsB,EAC9B,YAAY,2DAAc,EAC1B,OAAO,OAAO,eAAsB;AACnC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAW,YAAY;MAC9C,aAAa;KACd,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,MACG,QAAQ,wBAAwB,EAChC,YAAY,uEAAgB,EAC5B,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,eAAsB;AACnC,UAAM,yBAAyB,QAAQ,oBAAU,UAAU,kIAAyB;AACpF,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,UAAU,GAAG,UAAU,MAAM,CAAC;EACtE,CAAC;AACL;;;ACnCM,SAAU,oBAAoB,QAAiB,OAAkB;AACrE,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,yCAAW;AAE1B,MACG,QAAQ,MAAM,EACd,YAAY,2DAAc,EAC1B,OAAO,qBAAqB,wDAAW,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,CAAA;AACvC,QAAI,KAAK;AAAQ,aAAO,SAAS,KAAK;AACtC,gBAAY,MAAM,OAAO,QAAQ,MAAM,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,MACG,QAAQ,KAAK,EACb,YAAY,2DAAc,EAC1B,eAAe,qBAAqB,sCAAQ,EAC5C,eAAe,iBAAiB,iDAAc,EAC9C,eAAe,iBAAiB,+FAAkD,EAClF,eAAe,uBAAuB,gCAAO,EAC7C,OAAO,eAAe,mEAA2B,EACjD,OAAO,yBAAyB,oEAAkB,EAClD,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,OAAO,YAAY;MAC1C,QAAQ,KAAK;MAAQ,MAAM,KAAK;MAAM,MAAM,KAAK;MACjD,SAAS,KAAK;MACd,KAAK,KAAK,QAAQ,SAAY,SAAS,KAAK,KAAK,EAAE,IAAI;MACvD,UAAU,KAAK,aAAa,SAAY,SAAS,KAAK,UAAU,EAAE,IAAI;KACvE,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,+CAAY,EACxB,OAAO,qBAAqB,0BAAM,EAClC,OAAO,iBAAiB,0BAAM,EAC9B,OAAO,iBAAiB,4CAAS,EACjC,OAAO,uBAAuB,gCAAO,EACrC,OAAO,eAAe,yBAAe,EACrC,OAAO,yBAAyB,oBAAK,EACrC,OAAO,OAAO,OAAe,SAAQ;AACpC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,OAAO,YAAY;MACpD,QAAQ,KAAK;MAAQ,MAAM,KAAK;MAAM,MAAM,KAAK;MACjD,SAAS,KAAK;MACd,KAAK,KAAK,QAAQ,SAAY,SAAS,KAAK,KAAK,EAAE,IAAI;MACvD,UAAU,KAAK,aAAa,SAAY,SAAS,KAAK,UAAU,EAAE,IAAI;KACvE,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,+CAAY,EACxB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,UAAiB;AAC9B,UAAM,yBAAyB,QAAQ,gCAAY,KAAK,8FAAmB;AAC3E,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,UAAU,KAAK,GAAG,UAAU,MAAM,CAAC;EAC9D,CAAC;AACL;;;AC/DM,SAAU,oBAAoB,QAAiB,OAAkB;AACrE,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,iBAAO;AAEtB,MACG,QAAQ,MAAM,EACd,YAAY,mCAAU,EACtB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,OAAM,GAAI,UAAU,MAAM,CAAC;EACtD,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,mCAAU,EACtB,OAAO,yBAAyB,sEAAyB,EACzD,OAAO,uCAAuC,uGAA4B,EAC1E,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,CAAA;AACtC,QAAI,KAAK,eAAe;AAAW,WAAK,cAAc,KAAK,eAAe;AAC1E,QAAI,KAAK,4BAA4B;AAAW,WAAK,4BAA4B,KAAK,4BAA4B;AAClH,gBAAY,MAAM,OAAO,UAAU,IAAI,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,QAAM,MAAM,IACT,QAAQ,KAAK,EACb,YAAY,mCAAU;AAEzB,MACG,QAAQ,MAAM,EACd,YAAY,qDAAa,EACzB,OAAO,YAAW;AACjB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,WAAU,GAAI,UAAU,MAAM,CAAC;EAC1D,CAAC;AAEH,MACG,QAAQ,KAAK,EACb,YAAY,yCAAW,EACvB,OAAO,sBAAsB,8DAAY,EACzC,OAAO,cAAc,sFAAgB,EACrC,OAAO,wBAAwB,gFAAe,EAC9C,eAAe,mBAAmB,oBAAK,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,OAAgC,EAAE,OAAO,KAAK,MAAK;AACzD,QAAI,KAAK,UAAU;AACjB,WAAK,WAAW;AAChB,UAAI,KAAK,eAAe;AAAW,aAAK,aAAa,KAAK;IAC5D,OAAO;AACL,UAAI,KAAK;AAAW,aAAK,aAAa,KAAK;IAC7C;AACA,gBAAY,MAAM,OAAO,UAAU,IAAI,GAAG,UAAU,MAAM,CAAC;EAC7D,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,yCAAW,EACvB,OAAO,mBAAmB,oBAAK,EAC/B,OAAO,oBAAoB,kDAAe,EAC1C,OAAO,OAAO,OAAe,SAAQ;AACpC,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,OAAO,YAAY;MACvD,OAAO,KAAK;MACZ,QAAQ,KAAK;KACd,CAAC,GAAG,UAAU,MAAM,CAAC;EACxB,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,yCAAW,EACvB,OAAO,aAAa,0EAAc,EAClC,OAAO,OAAO,UAAiB;AAC9B,UAAM,yBAAyB,QAAQ,0BAAW,KAAK,8FAAmB;AAC1E,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,gBAAY,MAAM,OAAO,aAAa,KAAK,GAAG,UAAU,MAAM,CAAC;EACjE,CAAC;AACL;;;AC/EM,SAAU,oBAAoB,QAAiB,OAAkB;AACrE,QAAM,MAAM,OACT,QAAQ,KAAK,EACb,YAAY,cAAI;AAEnB,MACG,QAAQ,QAAQ,EAChB,YAAY,wDAAW,EACvB,eAAe,qBAAqB,sCAAQ,EAC5C,OAAO,eAAe,0BAAM,EAC5B,OAAO,uBAAuB,4CAAS,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAM;AAC5D,QAAI,KAAK;AAAO,aAAO,QAAQ,KAAK;AACpC,QAAI,KAAK;AAAS,aAAO,UAAU,KAAK;AACxC,gBAAY,MAAM,OAAO,aAAa,MAAM,GAAG,UAAU,MAAM,CAAC;EAClE,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,YAAY,kDAAU,EACtB,eAAe,qBAAqB,sCAAQ,EAC5C,OAAO,eAAe,0BAAM,EAC5B,OAAO,uBAAuB,4CAAS,EACvC,OAAO,OAAO,SAAQ;AACrB,UAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,UAAM,SAAiC,EAAE,QAAQ,KAAK,OAAM;AAC5D,QAAI,KAAK;AAAO,aAAO,QAAQ,KAAK;AACpC,QAAI,KAAK;AAAS,aAAO,UAAU,KAAK;AACxC,gBAAY,MAAM,OAAO,YAAY,MAAM,GAAG,UAAU,MAAM,CAAC;EACjE,CAAC;AACL;;;AC9BM,SAAU,kBAAkB,SAAkB,OAAkB;AACpE,UACG,QAAQ,IAAI,EACZ,YAAY,iEAAe,EAC3B,OAAO,OAAO,OAAgC,QAAgB;AAC7D,UAAM,OAAO,IAAI;AACjB,UAAM,WAAW,KAAK,KAAI;AAC1B,UAAM,UAAU,iBAAiB,OAAO,SAAS,OAAiB;AAClE,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,mFAAkB,MAAM,WAAW,4EAA0B;AAC3E,cAAQ,KAAK,CAAC;IAChB;AAEA,UAAM,QAAQ,CAAC,EAAE,SAAS,SAAS,QAAQ,IAAI,kBAAkB;AACjE,UAAM,SAAS,IAAI,UAAU;MAC3B,QAAQ,QAAQ;MAChB,SAAS,MAAM;MACf,YAAY,QAAQ;MACpB;KACD;AACD,gBAAY,MAAM,OAAO,MAAK,GAAI,UAAU,GAAG,CAAC;EAClD,CAAC;AACL;;;ApBNM,SAAU,IAAI,OAAoB,UAAU,SAAO;AACvD,QAAM,UAAU,IAAI,QAAO;AAE3B,UACG,KAAK,MAAM,WAAW,EACtB,YAAY,GAAG,MAAM,WAAW,MAAM,EACtC,QAAQ,OAAO,EACf,OAAO,qBAAqB,0CAAsB,CAAC,UAAiB;AACnE,QAAI,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,KAAK,GAAG;AACtC,YAAM,IAAI,MAAM,iIAA4C,KAAK,QAAG;IACtE;AACA,WAAO;EACT,GAAG,OAAO,EACT,OAAO,oBAAoB,8DAAY,EACvC,OAAO,aAAa,0EAAc,EAClC,OAAO,WAAW,mLAAkC;AAEvD,uBAAqB,SAAS,KAAK;AACnC,oBAAkB,SAAS,KAAK;AAGhC,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,0GAA+B,EAC3C,OAAO,uBAAuB,4IAAyB;AAE1D,6BAA2B,QAAQ,KAAK;AACxC,uBAAqB,QAAQ,KAAK;AAClC,sBAAoB,QAAQ,KAAK;AACjC,qBAAmB,QAAQ,KAAK;AAChC,uBAAqB,QAAQ,KAAK;AAClC,6BAA2B,QAAQ,KAAK;AACxC,sBAAoB,QAAQ,KAAK;AACjC,qBAAmB,QAAQ,KAAK;AAChC,6BAA2B,QAAQ,KAAK;AACxC,+BAA6B,QAAQ,KAAK;AAC1C,4BAA0B,QAAQ,KAAK;AACvC,sBAAoB,QAAQ,KAAK;AACjC,sBAAoB,QAAQ,KAAK;AACjC,sBAAoB,QAAQ,KAAK;AAEjC,UAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAgB;AACtD,QAAI,eAAe,UAAU;AAC3B,cAAQ,MAAM,uBAAQ,IAAI,SAAS,MAAM,IAAI,OAAO,EAAE;AACtD,UAAI,IAAI,OAAO,SAAS,GAAG;AACzB,mBAAW,KAAK,IAAI,QAAQ;AAC1B,kBAAQ,MAAM,OAAO,CAAC,EAAE;QAC1B;MACF;AACA,cAAQ,KAAK,CAAC;IAChB;AACA,QAAI,eAAe,OAAO;AACxB,cAAQ,MAAM,uBAAQ,IAAI,OAAO,EAAE;AACnC,cAAQ,KAAK,CAAC;IAChB;AACA,YAAQ,MAAM,4FAAiB;AAC/B,YAAQ,KAAK,CAAC;EAChB,CAAC;AACH;;;AqBhFA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,OAAS;AAAA,EACX;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,KAAO;AAAA,IACP,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,UAAY;AAAA,EACZ,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,WAAa;AAAA,EACf;AAAA,EACA,iBAAmB;AAAA,IACjB,gBAAgB;AAAA,IAChB,cAAc;AAAA,EAChB;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AACF;;;ACvCA,IAAI;AAAA,EACF,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AACb,GAAG,gBAAI,OAAO;","names":["path"]}
1
+ {"version":3,"sources":["../../core/src/index.ts","../../../shared/src/api-client.ts","../../core/src/commands/auth/login.ts","../../core/src/lib/config.ts","../../core/src/lib/command-helper.ts","../../core/src/lib/output.ts","../../core/src/commands/server/info.ts","../../core/src/commands/server/cron/index.ts","../../core/src/commands/server/wp/index.ts","../../core/src/commands/server/mail/index.ts","../../core/src/commands/server/spam-filter/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/auto-reply/index.ts","../../core/src/commands/server/smtp-abroad-restriction/index.ts","../../core/src/commands/server/dkim/index.ts","../../core/src/commands/server/dmarc/index.ts","../../core/src/commands/server/spf/index.ts","../../core/src/commands/server/ftp/index.ts","../../core/src/commands/server/db/index.ts","../../core/src/commands/server/php-version/index.ts","../../core/src/commands/server/domain/index.ts","../../core/src/commands/server/subdomain/index.ts","../../core/src/commands/server/ssl/index.ts","../../core/src/commands/server/dns/index.ts","../../core/src/commands/server/ssh/index.ts","../../core/src/commands/server/log/index.ts","../../core/src/commands/me/index.ts","../package.json","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { registerAuthCommands } from './commands/auth/login.js';\r\nimport { registerServerInfoCommands } from './commands/server/info.js';\r\nimport { registerCronCommands } from './commands/server/cron/index.js';\r\nimport { registerWpCommands } from './commands/server/wp/index.js';\r\nimport { registerMailCommands } from './commands/server/mail/index.js';\r\nimport { registerSpamFilterCommands } from './commands/server/spam-filter/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerAutoReplyCommands } from './commands/server/auto-reply/index.js';\r\nimport { registerSmtpAbroadRestrictionCommands } from './commands/server/smtp-abroad-restriction/index.js';\r\nimport { registerDkimCommands } from './commands/server/dkim/index.js';\r\nimport { registerDmarcCommands } from './commands/server/dmarc/index.js';\r\nimport { registerSpfCommands } from './commands/server/spf/index.js';\r\nimport { registerFtpCommands } from './commands/server/ftp/index.js';\r\nimport { registerDbCommands } from './commands/server/db/index.js';\r\nimport { registerPhpVersionCommands } from './commands/server/php-version/index.js';\r\nimport { registerServerDomainCommands } from './commands/server/domain/index.js';\r\nimport { registerSubdomainCommands } from './commands/server/subdomain/index.js';\r\nimport { registerSslCommands } from './commands/server/ssl/index.js';\r\nimport { registerDnsCommands } from './commands/server/dns/index.js';\r\nimport { registerSshCommands } from './commands/server/ssh/index.js';\r\nimport { registerLogCommands } from './commands/server/log/index.js';\r\nimport { registerMeCommand } from './commands/me/index.js';\r\n\r\nexport type { BrandConfig } from 'xnp-shared';\r\n\r\nexport function run(brand: BrandConfig, version = '0.0.0'): void {\r\n const program = new Command();\r\n\r\n program\r\n .name(brand.commandName)\r\n .description(`${brand.displayName} CLI`)\r\n .version(version)\r\n .option('--format <format>', '出力形式 (json, table)', (value: string) => {\r\n if (!['json', 'table'].includes(value)) {\r\n throw new Error(`--format は json または table を指定してください(入力値: ${value})`);\r\n }\r\n return value;\r\n }, 'table')\r\n .option('--profile <name>', '使用するプロファイル')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .option('--debug', 'デバッグ出力を有効化(リクエストURL・レスポンスヘッダを表示)');\r\n\r\n registerAuthCommands(program, brand);\r\n registerMeCommand(program, brand);\r\n\r\n // サーバー管理API(/server/v1)\r\n const server = program\r\n .command('server')\r\n .description('サーバー管理API(WordPress・メール・DBなど)')\r\n .option('--servername <name>', 'サーバー名(プロファイルのデフォルトを上書き)');\r\n\r\n registerServerInfoCommands(server, brand);\r\n registerCronCommands(server, brand);\r\n registerSshCommands(server, brand);\r\n registerWpCommands(server, brand);\r\n registerMailCommands(server, brand);\r\n registerSpamFilterCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerAutoReplyCommands(server, brand);\r\n registerSmtpAbroadRestrictionCommands(server, brand);\r\n registerDkimCommands(server, brand);\r\n registerDmarcCommands(server, brand);\r\n registerSpfCommands(server, brand);\r\n registerFtpCommands(server, brand);\r\n registerDbCommands(server, brand);\r\n registerPhpVersionCommands(server, brand);\r\n registerServerDomainCommands(server, brand);\r\n registerSubdomainCommands(server, brand);\r\n registerSslCommands(server, brand);\r\n registerDnsCommands(server, brand);\r\n registerLogCommands(server, brand);\r\n\r\n program.parseAsync(process.argv).catch((err: unknown) => {\r\n if (err instanceof ApiError) {\r\n console.error(`エラー [${err.errorCode}]: ${err.message}`);\r\n if (err.errors.length > 0) {\r\n for (const e of err.errors) {\r\n console.error(` - ${e}`);\r\n }\r\n }\r\n process.exit(1);\r\n }\r\n if (err instanceof Error) {\r\n console.error(`エラー: ${err.message}`);\r\n process.exit(1);\r\n }\r\n console.error('予期しないエラーが発生しました');\r\n process.exit(1);\r\n });\r\n}\r\n","const DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\nexport interface ApiErrorDetail {\r\n code: string;\r\n message: string;\r\n errors: string[];\r\n httpStatus: number;\r\n}\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly httpStatus: number,\r\n public readonly errorCode: string,\r\n public readonly errors: string[],\r\n ) {\r\n super(message);\r\n this.name = 'ApiError';\r\n }\r\n}\r\n\r\nexport interface RateLimitInfo {\r\n limit: number;\r\n remaining: number;\r\n reset: number;\r\n}\r\n\r\nexport interface ApiClientOptions {\r\n apiKey: string;\r\n apiBase: string;\r\n servername?: string;\r\n debug?: boolean;\r\n}\r\n\r\nexport class ApiClient {\r\n private readonly apiBase: string;\r\n private readonly apiKey: string;\r\n private readonly servername?: string;\r\n private readonly debug: boolean;\r\n public lastRateLimit: RateLimitInfo | null = null;\r\n\r\n constructor(opts: ApiClientOptions) {\r\n this.apiBase = opts.apiBase.replace(/\\/+$/, '');\r\n this.apiKey = opts.apiKey;\r\n this.servername = opts.servername;\r\n this.debug = opts.debug ?? false;\r\n }\r\n\r\n private serverPath(): string {\r\n if (!this.servername) {\r\n throw new Error('サーバー名が設定されていません。');\r\n }\r\n return `/v1/server/${encodeURIComponent(this.servername)}`;\r\n }\r\n\r\n // ================================================================\r\n // サーバー情報\r\n // ================================================================\r\n\r\n async getServerInfo(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info`);\r\n }\r\n\r\n async getServerUsage(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info/usage`);\r\n }\r\n\r\n // ================================================================\r\n // Cron\r\n // ================================================================\r\n\r\n async listCron(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/cron`);\r\n }\r\n\r\n async addCron(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/cron`, data);\r\n }\r\n\r\n async updateCron(cronId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/cron/${enc(cronId)}`, data);\r\n }\r\n\r\n async deleteCron(cronId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/cron/${enc(cronId)}`);\r\n }\r\n\r\n // ================================================================\r\n // WordPress\r\n // ================================================================\r\n\r\n async listWordpress(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wp`, params);\r\n }\r\n\r\n async addWordpress(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wp`, data);\r\n }\r\n\r\n async updateWordpress(wpId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n async deleteWordpress(wpId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // メールアカウント\r\n // ================================================================\r\n\r\n async listMail(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail`, params);\r\n }\r\n\r\n async getMail(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async addMail(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail`, data);\r\n }\r\n\r\n async updateMail(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}`, data);\r\n }\r\n\r\n async deleteMail(mailAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async getMailForwarding(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`);\r\n }\r\n\r\n async updateMailForwarding(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`, data);\r\n }\r\n\r\n // ================================================================\r\n // メール振り分け\r\n // ================================================================\r\n\r\n async listMailFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail-filter`, params);\r\n }\r\n\r\n async addMailFilter(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail-filter`, data);\r\n }\r\n\r\n async deleteMailFilter(filterId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);\r\n }\r\n\r\n // ================================================================\r\n // 迷惑メールフィルタ設定\r\n // ================================================================\r\n\r\n async listSpamFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spam-filter`, params);\r\n }\r\n\r\n async updateSpamFilter(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}`, data);\r\n }\r\n\r\n async updateSpamFilterDmarcReceiver(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}/dmarc-receiver`, data);\r\n }\r\n\r\n // ================================================================\r\n // 自動応答設定\r\n // ================================================================\r\n\r\n async listAutoReply(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply`, params);\r\n }\r\n\r\n async getAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n async addAutoReply(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/auto-reply`, data);\r\n }\r\n\r\n async updateAutoReply(mailAddress: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`, data);\r\n }\r\n\r\n async deleteAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n // ================================================================\r\n // SMTP認証国外アクセス制限\r\n // ================================================================\r\n\r\n async listSmtpAbroadRestriction(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/smtp-abroad-restriction`, params);\r\n }\r\n\r\n async updateSmtpAbroadRestriction(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/smtp-abroad-restriction/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // DKIM設定\r\n // ================================================================\r\n\r\n async listDkim(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim`, params);\r\n }\r\n\r\n async getDkim(fqdn: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim/${enc(fqdn)}`);\r\n }\r\n\r\n async updateDkim(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dkim/${enc(fqdn)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SPF設定\r\n // ================================================================\r\n\r\n async listSpf(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spf`, params);\r\n }\r\n\r\n async addSpf(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/spf`, data);\r\n }\r\n\r\n async updateSpf(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spf/${enc(fqdn)}`, data);\r\n }\r\n\r\n async deleteSpf(fqdn: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/spf/${enc(fqdn)}`);\r\n }\r\n\r\n // ================================================================\r\n // DMARC設定(送信側)\r\n // ================================================================\r\n\r\n async listDmarc(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dmarc`, params);\r\n }\r\n\r\n async updateDmarc(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dmarc/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // FTP\r\n // ================================================================\r\n\r\n async listFtp(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ftp`, params);\r\n }\r\n\r\n async addFtp(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ftp`, data);\r\n }\r\n\r\n async updateFtp(ftpAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ftp/${enc(ftpAccount)}`, data);\r\n }\r\n\r\n async deleteFtp(ftpAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ftp/${enc(ftpAccount)}`);\r\n }\r\n\r\n // ================================================================\r\n // MySQL\r\n // ================================================================\r\n\r\n async listDb(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db`);\r\n }\r\n\r\n async addDb(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db`, data);\r\n }\r\n\r\n async updateDb(dbName: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/${enc(dbName)}`, data);\r\n }\r\n\r\n async deleteDb(dbName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/${enc(dbName)}`);\r\n }\r\n\r\n async listDbUser(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user`);\r\n }\r\n\r\n async addDbUser(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user`, data);\r\n }\r\n\r\n async updateDbUser(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/user/${enc(dbUser)}`, data);\r\n }\r\n\r\n async deleteDbUser(dbUser: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}`);\r\n }\r\n\r\n async listDbUserGrant(dbUser: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`);\r\n }\r\n\r\n async addDbUserGrant(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n async deleteDbUserGrant(dbUser: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n // ================================================================\r\n // PHP バージョン\r\n // ================================================================\r\n\r\n async getPhpVersion(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-version`, params);\r\n }\r\n\r\n async updatePhpVersion(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-version/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // ドメイン(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDomain(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain`);\r\n }\r\n\r\n async getDomain(domain: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain/${enc(domain)}`);\r\n }\r\n\r\n async addDomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain`, data);\r\n }\r\n\r\n async updateDomain(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async deleteDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async resetDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain/${enc(domain)}/reset`, data);\r\n }\r\n\r\n // ================================================================\r\n // サブドメイン\r\n // ================================================================\r\n\r\n async listSubdomain(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/subdomain`, params);\r\n }\r\n\r\n async addSubdomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/subdomain`, data);\r\n }\r\n\r\n async updateSubdomain(subdomain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n async deleteSubdomain(subdomain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSL\r\n // ================================================================\r\n\r\n async listSsl(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssl`, params);\r\n }\r\n\r\n async installSsl(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssl`, data);\r\n }\r\n\r\n async uninstallSsl(commonName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssl/${enc(commonName)}`);\r\n }\r\n\r\n // ================================================================\r\n // DNS(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDns(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dns`, params);\r\n }\r\n\r\n async addDns(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/dns`, data);\r\n }\r\n\r\n async updateDns(dnsId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n async deleteDns(dnsId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSH\r\n // ================================================================\r\n\r\n async getSsh(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh`);\r\n }\r\n\r\n async updateSsh(data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh`, data);\r\n }\r\n\r\n async listSshKey(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh/key`);\r\n }\r\n\r\n async addSshKey(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssh/key`, data);\r\n }\r\n\r\n async updateSshKey(keyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh/key/${enc(keyId)}`, data);\r\n }\r\n\r\n async deleteSshKey(keyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssh/key/${enc(keyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // ログ\r\n // ================================================================\r\n\r\n async getAccessLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-log`, params);\r\n }\r\n\r\n async getErrorLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/error-log`, params);\r\n }\r\n\r\n // ================================================================\r\n // APIキー情報\r\n // ================================================================\r\n\r\n async getMe(): Promise<unknown> {\r\n return this.get('/v1/me');\r\n }\r\n\r\n // ================================================================\r\n // HTTP 基盤\r\n // ================================================================\r\n\r\n async get(path: string, params?: Record<string, string>): Promise<unknown> {\r\n let url = `${this.apiBase}${path}`;\r\n if (params && Object.keys(params).length > 0) {\r\n url += '?' + new URLSearchParams(params).toString();\r\n }\r\n return this.request('GET', url);\r\n }\r\n\r\n async post(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('POST', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async put(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('PUT', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async delete(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('DELETE', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n private async request(method: string, url: string, body?: Record<string, unknown>): Promise<unknown> {\r\n const headers: Record<string, string> = {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'Accept': 'application/json',\r\n };\r\n\r\n const init: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n headers['Content-Type'] = 'application/json';\r\n init.body = JSON.stringify(body);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`${method} ${url}`);\r\n if (init.body) dbg(`Body: ${init.body as string}`);\r\n }\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, init);\r\n } catch (err) {\r\n throw new Error(`通信エラー: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`HTTP ${response.status} ${response.statusText}`);\r\n const debugHeaders = ['x-ratelimit-limit', 'x-ratelimit-remaining', 'x-ratelimit-reset', 'x-concurrent-limit', 'x-concurrent-remaining', 'content-type'];\r\n for (const h of debugHeaders) {\r\n const v = response.headers.get(h);\r\n if (v !== null) dbg(` ${h}: ${v}`);\r\n }\r\n }\r\n\r\n const rateLimitHeader = response.headers.get('x-ratelimit-limit');\r\n if (rateLimitHeader) {\r\n this.lastRateLimit = {\r\n limit: parseInt(rateLimitHeader, 10),\r\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\r\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\r\n };\r\n }\r\n\r\n const text = await response.text();\r\n let data: unknown;\r\n try {\r\n data = JSON.parse(text);\r\n } catch {\r\n if (this.debug) {\r\n process.stderr.write(`[DEBUG] Raw response: ${text.substring(0, 500)}\\n`);\r\n }\r\n throw new ApiError(`Response parse error (HTTP ${response.status})`, response.status, 'PARSE_ERROR', []);\r\n }\r\n\r\n if (!response.ok) {\r\n const err = data as { error?: { code?: string; message?: string; errors?: string[] } };\r\n const errorCode = err?.error?.code || 'UNKNOWN_ERROR';\r\n const errorMessage = err?.error?.message || 'エラーが発生しました';\r\n const errors = err?.error?.errors || [];\r\n throw new ApiError(errorMessage, response.status, errorCode, errors);\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nfunction enc(s: string): string {\r\n return encodeURIComponent(s);\r\n}\r\n","import { Command } from 'commander';\r\nimport { password } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient, ApiError } from 'xnp-shared';\r\nimport { loadConfig, saveConfig } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nfunction maskApiKey(apiKey: string): string {\r\n return `${apiKey.substring(0, 8)}...`;\r\n}\r\n\r\nexport function registerAuthCommands(program: Command, brand: BrandConfig): void {\r\n const auth = program\r\n .command('auth')\r\n .description('認証設定');\r\n\r\n auth\r\n .command('login')\r\n .description('APIキーを設定(サーバー名は自動検出)')\r\n .option('--api-key <key>', 'APIキー')\r\n .option('--servername <name>', 'サーバー名(自動検出を上書き)')\r\n .action(async (opts: { apiKey?: string; servername?: string }, cmd: Command) => {\r\n const profileName: string = (cmd.optsWithGlobals().profile as string | undefined) ?? 'default';\r\n let apiKey = opts.apiKey;\r\n let servername = opts.servername;\r\n\r\n if (!apiKey) {\r\n apiKey = await password({ message: 'APIキーを入力:', mask: true });\r\n }\r\n if (!apiKey) {\r\n console.error('エラー: APIキーは必須です');\r\n process.exit(1);\r\n }\r\n\r\n console.error('認証情報を検証中...');\r\n const client = new ApiClient({ apiKey, apiBase: brand.apiBase });\r\n let meData: Record<string, unknown>;\r\n try {\r\n meData = await client.getMe() as Record<string, unknown>;\r\n } catch (err) {\r\n if (err instanceof ApiError && err.errorCode === 'UNAUTHORIZED') {\r\n console.error('エラー: APIキーが無効です。正しいAPIキーを指定してください。');\r\n process.exit(1);\r\n }\r\n throw err;\r\n }\r\n console.error('✓ 認証に成功しました');\r\n\r\n if (!servername && meData.servername) {\r\n servername = meData.servername as string;\r\n console.error(` サーバー名を自動検出しました: ${servername}`);\r\n }\r\n\r\n const config = loadConfig(brand);\r\n config.profiles[profileName] = {\r\n apiKey,\r\n ...(servername ? { servername } : {}),\r\n };\r\n if (!config.defaultProfile) {\r\n config.defaultProfile = profileName;\r\n }\r\n saveConfig(brand, config);\r\n\r\n console.error(`✓ プロファイル \"${profileName}\" を保存しました`);\r\n console.error(` 設定ファイル: ~/.config/${brand.configDir}/config.json`);\r\n });\r\n\r\n auth\r\n .command('status')\r\n .description('現在の認証状態を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profileName = (cmd.optsWithGlobals().profile as string | undefined) || config.defaultProfile || 'default';\r\n const profile = config.profiles[profileName];\r\n\r\n if (!profile) {\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: false,\r\n profile: profileName,\r\n message: `プロファイル \"${profileName}\" が見つかりません`,\r\n }, format);\r\n } else {\r\n console.error(`プロファイル \"${profileName}\" が見つかりません`);\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: true,\r\n profile: profileName,\r\n api_key: maskApiKey(profile.apiKey),\r\n servername: profile.servername ?? null,\r\n api_base: brand.apiBase,\r\n }, format);\r\n return;\r\n }\r\n\r\n console.log(`プロファイル: ${profileName}`);\r\n console.log(`APIキー: ${maskApiKey(profile.apiKey)}`);\r\n if (profile.servername) {\r\n console.log(`サーバー名: ${profile.servername}`);\r\n }\r\n console.log(`APIエンドポイント: ${brand.apiBase}`);\r\n });\r\n\r\n auth\r\n .command('profiles')\r\n .description('プロファイル一覧を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profiles = Object.keys(config.profiles);\r\n\r\n if (profiles.length === 0) {\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: [],\r\n message: 'プロファイルが見つかりません',\r\n }, format);\r\n } else {\r\n console.error('プロファイルが見つかりません');\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n const rows = profiles.map((name) => {\r\n const p = config.profiles[name]!;\r\n return {\r\n name,\r\n default: name === config.defaultProfile,\r\n api_key: maskApiKey(p.apiKey),\r\n servername: p.servername ?? null,\r\n };\r\n });\r\n\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: rows,\r\n }, format);\r\n return;\r\n }\r\n\r\n for (const name of profiles) {\r\n const marker = name === config.defaultProfile ? ' (default)' : '';\r\n const p = config.profiles[name]!;\r\n const key = maskApiKey(p.apiKey);\r\n const sv = p.servername ? ` servername=${p.servername}` : '';\r\n console.log(`${name}${marker}: key=${key}${sv}`);\r\n }\r\n });\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport type { AppConfig, Profile } from '../types.js';\r\n\r\nfunction getConfigDir(brand: BrandConfig): string {\r\n const home = os.homedir();\r\n return path.join(home, '.config', brand.configDir);\r\n}\r\n\r\nfunction getConfigPath(brand: BrandConfig): string {\r\n return path.join(getConfigDir(brand), 'config.json');\r\n}\r\n\r\nexport function loadConfig(brand: BrandConfig): AppConfig {\r\n const configPath = getConfigPath(brand);\r\n if (!fs.existsSync(configPath)) {\r\n return { defaultProfile: 'default', profiles: {} };\r\n }\r\n const raw = fs.readFileSync(configPath, 'utf-8');\r\n return JSON.parse(raw) as AppConfig;\r\n}\r\n\r\nexport function saveConfig(brand: BrandConfig, config: AppConfig): void {\r\n const configDir = getConfigDir(brand);\r\n fs.mkdirSync(configDir, { recursive: true });\r\n const configPath = getConfigPath(brand);\r\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function getActiveProfile(brand: BrandConfig, profileName?: string): Profile | null {\r\n const envPrefix = brand.brand.toUpperCase();\r\n const envApiKey = process.env[`${envPrefix}_API_KEY`] || process.env['XSERVER_API_KEY'];\r\n const envServername = process.env[`${envPrefix}_SERVERNAME`] || process.env['XSERVER_SERVERNAME'];\r\n\r\n if (envApiKey) {\r\n return {\r\n apiKey: envApiKey,\r\n servername: envServername,\r\n };\r\n }\r\n\r\n const config = loadConfig(brand);\r\n const name = profileName || config.defaultProfile || 'default';\r\n return config.profiles[name] || null;\r\n}\r\n","import type { Command } from 'commander';\r\nimport { confirm } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from './config.js';\r\nimport { formatOutput, type OutputFormat } from './output.js';\r\n\r\nfunction findRoot(cmd: Command): Command {\r\n let root = cmd;\r\n while (root.parent) root = root.parent;\r\n return root;\r\n}\r\n\r\nexport function resolveClient(cmd: Command, brand: BrandConfig): ApiClient {\r\n const root = findRoot(cmd);\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const servername = resolveServername(cmd) ?? profile.servername;\r\n return new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername,\r\n debug,\r\n });\r\n}\r\n\r\nfunction resolveServername(cmd: Command): string | undefined {\r\n let current: Command | null = cmd;\r\n while (current) {\r\n const val = current.opts()?.servername as string | undefined;\r\n if (val) return val;\r\n current = current.parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getFormat(cmd: Command): OutputFormat {\r\n const root = findRoot(cmd);\r\n return (root.opts().format as OutputFormat) || 'table';\r\n}\r\n\r\nexport function printResult(data: unknown, format: OutputFormat): void {\r\n console.log(formatOutput(data, format));\r\n}\r\n\r\nexport async function confirmDestructiveAction(cmd: Command, message: string): Promise<void> {\r\n const root = findRoot(cmd);\r\n if (root.opts().yes || process.argv.includes('--yes') || process.argv.includes('-y')) return;\r\n\r\n const ok = await confirm({ message, default: false });\r\n if (!ok) {\r\n console.error('キャンセルしました');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function pickDefined(obj: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value !== undefined) result[key] = value;\r\n }\r\n return result;\r\n}\r\n","export type OutputFormat = 'json' | 'table';\r\n\r\nexport function formatOutput(data: unknown, format: OutputFormat): string {\r\n if (format === 'json') {\r\n return JSON.stringify(data, null, 2);\r\n }\r\n return formatTable(data);\r\n}\r\n\r\nfunction formatTable(data: unknown): string {\r\n if (data === null || data === undefined) {\r\n return '(データなし)';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) return '(データなし)';\r\n return renderArrayTable(data as Record<string, unknown>[]);\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const obj = data as Record<string, unknown>;\r\n const arrayEntry = Object.entries(obj).find(\r\n ([, v]) => Array.isArray(v) && (v.length === 0 || (typeof v[0] === 'object' && v[0] !== null)),\r\n );\r\n if (arrayEntry) {\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayEntry[0]);\r\n const parts: string[] = [];\r\n if (scalarEntries.length > 0) {\r\n parts.push(renderKeyValueTable(Object.fromEntries(scalarEntries)));\r\n parts.push('');\r\n }\r\n parts.push(renderArrayTable(arrayEntry[1] as Record<string, unknown>[]));\r\n return parts.join('\\n');\r\n }\r\n return renderKeyValueTable(obj);\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\nfunction renderKeyValueTable(obj: Record<string, unknown>): string {\r\n const entries = Object.entries(obj).map(([key, value]) => ({\r\n key,\r\n value: formatValue(value),\r\n }));\r\n\r\n const maxKeyLen = Math.max(...entries.map(e => displayWidth(e.key)));\r\n const lines = entries.map(e => `${padRight(e.key, maxKeyLen)} ${e.value}`);\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderArrayTable(items: Record<string, unknown>[]): string {\r\n if (items.length === 0) return '(データなし)';\r\n\r\n const keys = Object.keys(items[0]!);\r\n\r\n const colWidths = keys.map(key => {\r\n const headerWidth = displayWidth(key);\r\n const maxDataWidth = Math.max(\r\n ...items.map(item => displayWidth(formatValue(item[key]))),\r\n );\r\n return Math.max(headerWidth, maxDataWidth);\r\n });\r\n\r\n const header = keys.map((key, i) => padRight(key, colWidths[i]!)).join(' ');\r\n const separator = colWidths.map(w => '-'.repeat(w)).join(' ');\r\n const rows = items.map(item =>\r\n keys.map((key, i) => padRight(formatValue(item[key]), colWidths[i]!)).join(' '),\r\n );\r\n\r\n return [header, separator, ...rows].join('\\n');\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return String(value);\r\n}\r\n\r\nfunction displayWidth(str: string): number {\r\n let width = 0;\r\n for (const char of str) {\r\n const code = char.codePointAt(0)!;\r\n if (\r\n (code >= 0x1100 && code <= 0x115f) ||\r\n (code >= 0x2e80 && code <= 0xa4cf) ||\r\n (code >= 0xac00 && code <= 0xd7af) ||\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n (code >= 0xfe10 && code <= 0xfe6f) ||\r\n (code >= 0xff01 && code <= 0xff60) ||\r\n (code >= 0xffe0 && code <= 0xffe6) ||\r\n (code >= 0x20000 && code <= 0x2fffd) ||\r\n (code >= 0x30000 && code <= 0x3fffd)\r\n ) {\r\n width += 2;\r\n } else {\r\n width += 1;\r\n }\r\n }\r\n return width;\r\n}\r\n\r\nfunction padRight(str: string, targetWidth: number): string {\r\n const currentWidth = displayWidth(str);\r\n const padding = Math.max(0, targetWidth - currentWidth);\r\n return str + ' '.repeat(padding);\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerServerInfoCommands(parent: Command, brand: BrandConfig): void {\r\n parent\r\n .command('info')\r\n .description('サーバー情報を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerInfo(), getFormat(parent));\r\n });\r\n\r\n parent\r\n .command('usage')\r\n .description('サーバー利用状況を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerUsage(), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerCronCommands(parent: Command, brand: BrandConfig): void {\r\n const cron = parent\r\n .command('cron')\r\n .description('Cron設定');\r\n\r\n cron\r\n .command('list')\r\n .description('Cron一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listCron(), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('add')\r\n .description('Cronを新規追加')\r\n .requiredOption('--minute <value>', '分(例: */5, 0, *)')\r\n .requiredOption('--hour <value>', '時(例: *, 3, 0-6)')\r\n .requiredOption('--command <value>', '実行コマンド')\r\n .option('--day <value>', '日', '*')\r\n .option('--month <value>', '月', '*')\r\n .option('--weekday <value>', '曜日', '*')\r\n .option('--comment <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n printResult(await client.addCron(data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('update <cronId>')\r\n .description('Cronを更新')\r\n .option('--minute <value>', '分')\r\n .option('--hour <value>', '時')\r\n .option('--day <value>', '日')\r\n .option('--month <value>', '月')\r\n .option('--weekday <value>', '曜日')\r\n .option('--command <value>', '実行コマンド')\r\n .option('--comment <value>', 'メモ')\r\n .option('--enabled <value>', '有効/無効 (true/false)')\r\n .action(async (cronId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n if (opts.enabled !== undefined) data.enabled = opts.enabled === 'true';\r\n printResult(await client.updateCron(cronId, data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('delete <cronId>')\r\n .description('Cronを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (cronId: string) => {\r\n await confirmDestructiveAction(parent, `Cron \"${cronId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteCron(cronId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerWpCommands(parent: Command, brand: BrandConfig): void {\r\n const wp = parent\r\n .command('wp')\r\n .description('WordPress簡単インストール');\r\n\r\n wp\r\n .command('list')\r\n .description('WordPress一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listWordpress(params), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('add')\r\n .description('WordPressを新規インストール')\r\n .requiredOption('--url <url>', 'インストール先URL(例: example.com/blog)')\r\n .requiredOption('--title <title>', 'サイトタイトル')\r\n .requiredOption('--admin-username <username>', '管理者ユーザー名')\r\n .requiredOption('--admin-password <password>', '管理者パスワード')\r\n .requiredOption('--admin-email <email>', '管理者メールアドレス')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n url: opts.url, title: opts.title,\r\n admin_username: opts.adminUsername, admin_password: opts.adminPassword,\r\n admin_email: opts.adminEmail, memo: opts.memo,\r\n });\r\n printResult(await client.addWordpress(data), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('update <wpId>')\r\n .description('WordPress設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (wpId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordpress(wpId, pickDefined({ memo: opts.memo })), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('delete <wpId>')\r\n .description('WordPressを削除')\r\n .option('--delete-db <value>', '関連するMySQLデータベースも削除するか(デフォルト: true)')\r\n .option('--delete-db-user <value>', '関連するMySQLユーザーも削除するか(デフォルト: false)')\r\n .option('--delete-cron <value>', 'キャッシュ自動削除Cronも削除するか(デフォルト: true)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (wpId: string, opts) => {\r\n await confirmDestructiveAction(parent, `WordPress \"${wpId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n delete_db: opts.deleteDb !== undefined ? opts.deleteDb === 'true' : undefined,\r\n delete_db_user: opts.deleteDbUser !== undefined ? opts.deleteDbUser === 'true' : undefined,\r\n delete_cron: opts.deleteCron !== undefined ? opts.deleteCron === 'true' : undefined,\r\n });\r\n printResult(await client.deleteWordpress(wpId, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailCommands(parent: Command, brand: BrandConfig): void {\r\n const mail = parent\r\n .command('mail')\r\n .description('メールアカウント設定');\r\n\r\n mail\r\n .command('list')\r\n .description('メールアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMail(params), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('get <mailAccount>')\r\n .description('メールアカウント詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('add <mailAddress>')\r\n .description('メールアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAddress: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n mail_address: mailAddress, password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addMail(data), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('update <mailAccount>')\r\n .description('メールアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateMail(mailAccount, pickDefined({\r\n password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('delete <mailAccount>')\r\n .description('メールアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (mailAccount: string) => {\r\n await confirmDestructiveAction(parent, `メールアカウント \"${mailAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-get <mailAccount>')\r\n .description('メール転送設定を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMailForwarding(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-update <mailAccount>')\r\n .description('メール転送設定を更新')\r\n .option('--forwarding-addresses <addresses>', '転送先アドレス(カンマ区切り)')\r\n .option('--keep-in-mailbox <value>', '転送後もメールボックスに残すか(true/false)')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.forwardingAddresses) data.forwarding_addresses = opts.forwardingAddresses.split(',').map((a: string) => a.trim());\r\n if (opts.keepInMailbox !== undefined) data.keep_in_mailbox = opts.keepInMailbox === 'true';\r\n printResult(await client.updateMailForwarding(mailAccount, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nfunction parseAddressList(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((a) => a.trim()).filter((a) => a !== '');\r\n}\r\n\r\nexport function registerSpamFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const spamFilter = parent\r\n .command('spam-filter')\r\n .description('迷惑メールフィルタ設定');\r\n\r\n spamFilter\r\n .command('list')\r\n .description('迷惑メールフィルタ設定を取得')\r\n .option('--domain <domain>', '対象ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSpamFilter(params), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('update <domain>')\r\n .description('迷惑メールフィルタ設定を更新(指定した項目のみ)')\r\n .option('--filter-type <value>', '迷惑メールフィルタ(off / standard / cloudmark_authority)')\r\n .option('--detection-action <action>', '検知時の処理(inbox / spam / trash / delete)')\r\n .option('--white-list <addresses>', 'ホワイトリスト(カンマ区切り。空文字でクリア)')\r\n .option('--black-list <addresses>', 'ブラックリスト(カンマ区切り。空文字でクリア)')\r\n .option(\r\n '--spam-level <level>',\r\n '標準スパムフィルタ判定基準(very_lenient / lenient / normal / strict / very_strict / strictest)',\r\n )\r\n .option('--strict-non-japanese-subject <value>', '日本語を含まない件名に対して判定を厳しくする(true/false)')\r\n .option('--strict-html-mail <value>', 'HTMLメールに対して判定を厳しくする(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.filterType !== undefined) data.filter_type = opts.filterType;\r\n if (opts.detectionAction !== undefined) data.detection_action = opts.detectionAction;\r\n if (opts.whiteList !== undefined) data.white_list = parseAddressList(opts.whiteList);\r\n if (opts.blackList !== undefined) data.black_list = parseAddressList(opts.blackList);\r\n if (opts.spamLevel !== undefined) data.spam_level = opts.spamLevel;\r\n if (opts.strictNonJapaneseSubject !== undefined) {\r\n data.strict_non_japanese_subject = opts.strictNonJapaneseSubject;\r\n }\r\n if (opts.strictHtmlMail !== undefined) {\r\n data.strict_html_mail = opts.strictHtmlMail;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpamFilter(domain, data), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('dmarc-receiver-update <domain>')\r\n .description('受信側DMARC設定を更新')\r\n .requiredOption('--dmarc-receiver <value>', '受信側DMARC設定(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSpamFilterDmarcReceiver(domain, {\r\n dmarc_receiver: opts.dmarcReceiver,\r\n }),\r\n getFormat(parent),\r\n );\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const mailFilter = parent\r\n .command('mail-filter')\r\n .description('メール振り分け設定');\r\n\r\n mailFilter\r\n .command('list')\r\n .description('メール振り分け設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMailFilter(params), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('add')\r\n .description('メール振り分け設定を新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--condition-keyword <keyword>', '条件キーワード')\r\n .requiredOption('--condition-field <field>', '条件対象(subject / from / to / body / header)')\r\n .option('--condition-match-type <type>', '一致条件(contain / match / start_from。デフォルト: contain)')\r\n .requiredOption('--action-type <type>', 'アクション種別(mail_address / spam_folder / trash / delete)')\r\n .option('--action-target <target>', '転送先メールアドレス(action-typeがmail_addressの場合)')\r\n .option('--action-method <method>', '処理方法(move / copy。デフォルト: move)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {\r\n domain: opts.domain,\r\n conditions: [{\r\n keyword: opts.conditionKeyword,\r\n field: opts.conditionField,\r\n match_type: opts.conditionMatchType || 'contain',\r\n }],\r\n action: {\r\n type: opts.actionType,\r\n target: opts.actionTarget || '',\r\n method: opts.actionMethod || 'move',\r\n },\r\n };\r\n printResult(await client.addMailFilter(data), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('delete <filterId>')\r\n .description('メール振り分け設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (filterId: string) => {\r\n await confirmDestructiveAction(parent, `メール振り分け設定 \"${filterId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMailFilter(filterId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerAutoReplyCommands(parent: Command, brand: BrandConfig): void {\r\n const autoReply = parent\r\n .command('auto-reply')\r\n .description('自動応答設定');\r\n\r\n autoReply\r\n .command('list')\r\n .description('自動応答設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listAutoReply(params), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('get <mailAddress>')\r\n .description('自動応答設定の詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getAutoReply(mailAccount), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('add')\r\n .description('自動応答設定を追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--mail-address <address>', 'メールアドレス')\r\n .requiredOption('--from-name <name>', '送信者名')\r\n .requiredOption('--subject <subject>', '件名')\r\n .requiredOption('--body <body>', '本文')\r\n .requiredOption('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addAutoReply({\r\n domain: opts.domain,\r\n mail_address: opts.mailAddress,\r\n from_name: opts.fromName,\r\n subject: opts.subject,\r\n body: opts.body,\r\n quote_incoming: opts.quoteIncoming,\r\n }), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('update <mailAddress>')\r\n .description('自動応答設定を更新(指定した項目のみ)')\r\n .option('--from-name <name>', '送信者名')\r\n .option('--subject <subject>', '件名')\r\n .option('--body <body>', '本文')\r\n .option('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (mailAccount: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n if (opts.fromName !== undefined) data.from_name = opts.fromName;\r\n if (opts.subject !== undefined) data.subject = opts.subject;\r\n if (opts.body !== undefined) data.body = opts.body;\r\n if (opts.quoteIncoming !== undefined) {\r\n data.quote_incoming = opts.quoteIncoming;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください(--from-name / --subject / --body / --quote-incoming)');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAutoReply(mailAccount, data), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('delete <mailAddress>')\r\n .description('自動応答設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (mailAccount: string) => {\r\n await confirmDestructiveAction(parent, `自動応答設定 \"${mailAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteAutoReply(mailAccount), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSmtpAbroadRestrictionCommands(parent: Command, brand: BrandConfig): void {\r\n const smtpAbroadRestriction = parent\r\n .command('smtp-abroad-restriction')\r\n .description('SMTP認証の国外アクセス制限設定');\r\n\r\n smtpAbroadRestriction\r\n .command('list')\r\n .description('SMTP認証の国外アクセス制限設定を取得')\r\n .option('--domain <domain>', '対象ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSmtpAbroadRestriction(params), getFormat(parent));\r\n });\r\n\r\n smtpAbroadRestriction\r\n .command('update <domain>')\r\n .description('SMTP認証の国外アクセス制限設定を更新')\r\n .requiredOption('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSmtpAbroadRestriction(domain, {\r\n abroad_access_restriction: opts.abroadAccessRestriction,\r\n }),\r\n getFormat(parent),\r\n );\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDkimCommands(parent: Command, brand: BrandConfig): void {\r\n const dkim = parent\r\n .command('dkim')\r\n .description('DKIM設定');\r\n\r\n dkim\r\n .command('list')\r\n .description('DKIM設定一覧を取得')\r\n .option('--domain <domain>', '対象ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDkim(params), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('get <fqdn>')\r\n .description('DKIM設定の詳細を取得')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDkim(fqdn), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('update <fqdn>')\r\n .description('DKIM設定の有効/無効を切り替え')\r\n .requiredOption('--enabled <value>', 'DKIMの有効/無効(true/false または 1/0)')\r\n .action(async (fqdn: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateDkim(fqdn, { enabled: opts.enabled }),\r\n getFormat(parent),\r\n );\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nfunction parseNotificationMailAddresses(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((address) => address.trim()).filter((address) => address !== '');\r\n}\r\n\r\nexport function registerDmarcCommands(parent: Command, brand: BrandConfig): void {\r\n const dmarc = parent\r\n .command('dmarc')\r\n .description('送信側DMARC設定');\r\n\r\n dmarc\r\n .command('list')\r\n .description('送信側DMARC設定を取得')\r\n .option('--domain <domain>', '対象ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDmarc(params), getFormat(parent));\r\n });\r\n\r\n dmarc\r\n .command('update <domain>')\r\n .description('送信側DMARC設定を更新(指定した項目のみ)')\r\n .option('--policy <policy>', 'DMARCポリシー(none / quarantine / reject)')\r\n .option('--report-enabled <value>', 'レポート通知の有効/無効(true/false または 1/0)。false のとき通知先は自動的に空になる')\r\n .option('--notification-mail-addresses <addresses>', 'レポート通知先メールアドレス(カンマ区切り)。--report-enabled true のときは1件以上必須')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.policy !== undefined) data.policy = opts.policy;\r\n if (opts.reportEnabled !== undefined) {\r\n data.report_enabled = opts.reportEnabled;\r\n }\r\n if (opts.notificationMailAddresses !== undefined) {\r\n data.notification_mail_addresses = parseNotificationMailAddresses(opts.notificationMailAddresses);\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDmarc(domain, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_ACTIONS = ['reset', 'enable_gmail', 'custom'] as const;\r\n\r\nexport function registerSpfCommands(parent: Command, brand: BrandConfig): void {\r\n const spf = parent\r\n .command('spf')\r\n .description('SPF設定');\r\n\r\n spf\r\n .command('list')\r\n .description('SPF設定一覧を取得')\r\n .option('--domain <domain>', '対象ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSpf(params), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('add')\r\n .description('SPF設定を追加')\r\n .requiredOption('--fqdn <fqdn>', 'FQDN(example.com または sub.example.com)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addSpf({ fqdn: opts.fqdn }), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('update <fqdn>')\r\n .description('SPF設定を更新(reset / enable_gmail / custom)')\r\n .requiredOption(\r\n '--action <action>',\r\n `操作種別(${UPDATE_ACTIONS.join(' / ')})`,\r\n )\r\n .option('--spf-record <record>', 'カスタムSPFレコード(action=custom のとき必須)')\r\n .action(async (fqdn: string, opts) => {\r\n const body: Record<string, unknown> = { action: opts.action };\r\n if (opts.spfRecord !== undefined) body.spf_record = opts.spfRecord;\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpf(fqdn, body), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('delete <fqdn>')\r\n .description('SPF設定を削除')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSpf(fqdn), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerFtpCommands(parent: Command, brand: BrandConfig): void {\r\n const ftp = parent\r\n .command('ftp')\r\n .description('FTPアカウント設定');\r\n\r\n ftp\r\n .command('list')\r\n .description('FTPアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listFtp(params), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('add <ftpAccount>')\r\n .description('FTPアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB。0で無制限)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n ftp_account: ftpAccount, password: opts.password,\r\n directory: opts.directory, quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addFtp(data), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('update <ftpAccount>')\r\n .description('FTPアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateFtp(ftpAccount, pickDefined({\r\n password: opts.password, directory: opts.directory,\r\n quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('delete <ftpAccount>')\r\n .description('FTPアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (ftpAccount: string) => {\r\n await confirmDestructiveAction(parent, `FTPアカウント \"${ftpAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteFtp(ftpAccount), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDbCommands(parent: Command, brand: BrandConfig): void {\r\n const db = parent\r\n .command('db')\r\n .description('MySQL設定');\r\n\r\n db\r\n .command('list')\r\n .description('データベース一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDb(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('add <nameSuffix>')\r\n .description('データベースを新規作成')\r\n .option('--character-set <charset>', '文字コード(utf8mb4 / UTF-8 / EUC-JP / SHIFT-JIS / Binary。デフォルト: utf8mb4)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDb(pickDefined({\r\n name_suffix: nameSuffix, character_set: opts.characterSet, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('update <dbName>')\r\n .description('データベースのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDb(dbName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('delete <dbName>')\r\n .description('データベースを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbName: string) => {\r\n await confirmDestructiveAction(parent, `データベース \"${dbName}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDb(dbName), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-list')\r\n .description('MySQLユーザー一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUser(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-add <nameSuffix>')\r\n .description('MySQLユーザーを新規作成')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUser(pickDefined({\r\n name_suffix: nameSuffix, password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-update <dbUser>')\r\n .description('MySQLユーザー設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDbUser(dbUser, pickDefined({\r\n password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-delete <dbUser>')\r\n .description('MySQLユーザーを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUser(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-list <dbUser>')\r\n .description('MySQLユーザーの権限一覧を取得')\r\n .action(async (dbUser: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUserGrant(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-add <dbUser>')\r\n .description('MySQLユーザーに権限を追加')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-delete <dbUser>')\r\n .description('MySQLユーザーの権限を削除')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string, opts) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" のデータベース \"${opts.dbName}\" への権限を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerPhpVersionCommands(parent: Command, brand: BrandConfig): void {\r\n const phpVer = parent\r\n .command('php-version')\r\n .description('PHPバージョン設定');\r\n\r\n phpVer\r\n .command('get')\r\n .description('PHPバージョン確認')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.getPhpVersion(params), getFormat(parent));\r\n });\r\n\r\n phpVer\r\n .command('update <domain>')\r\n .description('PHPバージョンを変更')\r\n .requiredOption('--php <version>', 'PHPバージョン(例: 8.2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpVersion(domain, { version: opts.php }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerServerDomainCommands(parent: Command, brand: BrandConfig): void {\r\n const domain = parent\r\n .command('domain')\r\n .description('ドメイン設定');\r\n\r\n domain\r\n .command('list')\r\n .description('ドメイン設定一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDomain(), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('get <domain>')\r\n .description('ドメイン設定詳細を取得')\r\n .action(async (domainName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDomain(domainName), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('add <domain>')\r\n .description('ドメイン設定を新規追加')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--redirect-https <value>', 'HTTPS転送設定(デフォルト: sslと同じ値)')\r\n .option('--ai-crawler-block <value>', 'AIクローラー遮断設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { domain: domainName };\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.redirectHttps !== undefined) data.redirect_https = opts.redirectHttps === 'true';\r\n if (opts.aiCrawlerBlock !== undefined) data.ai_crawler_block_enabled = opts.aiCrawlerBlock === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addDomain(data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('update <domain>')\r\n .description('ドメイン設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDomain(domainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('delete <domain>')\r\n .description('ドメイン設定を削除')\r\n .option('--delete-files', 'ユーザー公開領域のドメインディレクトリも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteDomain(domainName, data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('reset <domain>')\r\n .description('ドメイン設定を初期化')\r\n .requiredOption('--type <type>', 'リセット種別(all: 全初期化 / web: Web領域のみ / other: Web以外)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を \"${opts.type}\" で初期化します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetDomain(domainName, { type: opts.type }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSubdomainCommands(parent: Command, brand: BrandConfig): void {\r\n const subdomain = parent\r\n .command('subdomain')\r\n .description('サブドメイン設定');\r\n\r\n subdomain\r\n .command('list')\r\n .description('サブドメイン設定一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSubdomain(params), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('add <subdomain>')\r\n .description('サブドメインを新規追加')\r\n .option('--document-root-type <type>', 'ドキュメントルート種別(subdomain_only: /public_html/sub, full_subdomain: /public_html/sub.example.com)')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { subdomain: subdomainName };\r\n if (opts.documentRootType !== undefined) data.document_root_type = opts.documentRootType;\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addSubdomain(data), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('update <subdomain>')\r\n .description('サブドメインのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSubdomain(subdomainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('delete <subdomain>')\r\n .description('サブドメインを削除')\r\n .option('--delete-files', '関連ファイルも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (subdomainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `サブドメイン \"${subdomainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteSubdomain(subdomainName, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSslCommands(parent: Command, brand: BrandConfig): void {\r\n const ssl = parent\r\n .command('ssl')\r\n .description('SSL設定');\r\n\r\n ssl\r\n .command('list')\r\n .description('SSL設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSsl(params), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('install <commonName>')\r\n .description('無料SSLをインストール')\r\n .action(async (commonName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.installSsl(pickDefined({\r\n common_name: commonName,\r\n })), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('uninstall <commonName>')\r\n .description('無料SSLをアンインストール')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (commonName: string) => {\r\n await confirmDestructiveAction(parent, `無料SSL \"${commonName}\" をアンインストールします。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.uninstallSsl(commonName), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDnsCommands(parent: Command, brand: BrandConfig): void {\r\n const dns = parent\r\n .command('dns')\r\n .description('DNSレコード設定');\r\n\r\n dns\r\n .command('list')\r\n .description('DNSレコード一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDns(params), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('add')\r\n .description('DNSレコードを新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--host <host>', 'ホスト名(@でapex)')\r\n .requiredOption('--type <type>', 'レコードタイプ(A / AAAA / CNAME / MX / TXT / SRV / CAA)')\r\n .requiredOption('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400。デフォルト: 3600)')\r\n .option('--priority <priority>', '優先度(MX/SRVレコード用)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDns(pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('update <dnsId>')\r\n .description('DNSレコードを更新')\r\n .option('--domain <domain>', 'ドメイン')\r\n .option('--host <host>', 'ホスト名')\r\n .option('--type <type>', 'レコードタイプ')\r\n .option('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400)')\r\n .option('--priority <priority>', '優先度')\r\n .action(async (dnsId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDns(dnsId, pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('delete <dnsId>')\r\n .description('DNSレコードを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dnsId: string) => {\r\n await confirmDestructiveAction(parent, `DNSレコード \"${dnsId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDns(dnsId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSshCommands(parent: Command, brand: BrandConfig): void {\r\n const ssh = parent\r\n .command('ssh')\r\n .description('SSH設定');\r\n\r\n ssh\r\n .command('show')\r\n .description('SSH設定を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getSsh(), getFormat(parent));\r\n });\r\n\r\n ssh\r\n .command('update')\r\n .description('SSH設定を変更')\r\n .option('--ssh-enabled <value>', 'SSH接続の有効/無効(true/false)')\r\n .option('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.sshEnabled !== undefined) data.ssh_enabled = opts.sshEnabled === 'true';\r\n if (opts.abroadAccessRestriction !== undefined) data.abroad_access_restriction = opts.abroadAccessRestriction === 'true';\r\n printResult(await client.updateSsh(data), getFormat(parent));\r\n });\r\n\r\n const key = ssh\r\n .command('key')\r\n .description('SSH公開鍵管理');\r\n\r\n key\r\n .command('list')\r\n .description('SSH公開鍵一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listSshKey(), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('add')\r\n .description('SSH公開鍵を登録')\r\n .option('--public-key <key>', '公開鍵(手動登録時)')\r\n .option('--generate', 'サーバー側で鍵ペアを自動生成')\r\n .option('--passphrase <value>', 'パスフレーズ(自動生成時)')\r\n .requiredOption('--label <value>', 'ラベル')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { label: opts.label };\r\n if (opts.generate) {\r\n data.generate = true;\r\n if (opts.passphrase !== undefined) data.passphrase = opts.passphrase;\r\n } else {\r\n if (opts.publicKey) data.public_key = opts.publicKey;\r\n }\r\n printResult(await client.addSshKey(data), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('update <keyId>')\r\n .description('SSH公開鍵を更新')\r\n .option('--label <value>', 'ラベル')\r\n .option('--status <value>', 'ステータス(on/off)')\r\n .action(async (keyId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSshKey(keyId, pickDefined({\r\n label: opts.label,\r\n status: opts.status,\r\n })), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('delete <keyId>')\r\n .description('SSH公開鍵を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (keyId: string) => {\r\n await confirmDestructiveAction(parent, `SSH公開鍵 \"${keyId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSshKey(keyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerLogCommands(parent: Command, brand: BrandConfig): void {\r\n const log = parent\r\n .command('log')\r\n .description('ログ');\r\n\r\n log\r\n .command('access')\r\n .description('アクセスログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getAccessLog(params), getFormat(parent));\r\n });\r\n\r\n log\r\n .command('error')\r\n .description('エラーログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getErrorLog(params), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerMeCommand(program: Command, brand: BrandConfig): void {\r\n program\r\n .command('me')\r\n .description('現在のAPIキー情報を表示')\r\n .action(async (_opts: Record<string, unknown>, cmd: Command) => {\r\n const root = cmd.parent!;\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const client = new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername: profile.servername,\r\n debug,\r\n });\r\n printResult(await client.getMe(), getFormat(cmd));\r\n });\r\n}\r\n","{\n \"name\": \"star8-cli\",\n \"version\": \"1.1.0\",\n \"description\": \"Official CLI for Star8 API — manage your Star8 hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"star8\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"tsc\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"keywords\": [\n \"star8\",\n \"cli\",\n \"api\",\n \"hosting\",\n \"server\",\n \"webhosting\"\n ],\n \"author\": \"Xserver Inc.\",\n \"license\": \"MIT\",\n \"homepage\": \"https://developer.xserver.ne.jp\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.10.1\",\n \"commander\": \"^13.0.0\"\n },\n \"devDependencies\": {\n \"xnp-cli-core\": \"*\",\n \"xnp-shared\": \"*\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","import { run } from 'xnp-cli-core';\r\nimport pkg from '../package.json' with { type: 'json' };\r\n\r\nrun({\r\n brand: 'star8',\r\n apiBase: 'https://api.star.ne.jp',\r\n displayName: 'Star8 API',\r\n commandName: 'star8',\r\n configDir: 'star8-cli',\r\n}, pkg.version);\r\n"],"mappings":"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","names":["path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "star8-cli",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Official CLI for Star8 API — manage your Star8 hosting from the terminal",
5
5
  "type": "module",
6
6
  "bin": {