shincloud-cli 1.2.1 → 1.3.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 +38 -31
- package/dist/index.js +1687 -259
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/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/server/resource-monitor/index.ts","../../core/src/commands/server/waf/index.ts","../../core/src/commands/server/php-ini/index.ts","../../core/src/commands/server/wordpress-security/index.ts","../../core/src/commands/server/x-accelerator/index.ts","../../core/src/commands/server/server-cache/index.ts","../../core/src/commands/server/browser-cache/index.ts","../../core/src/commands/server/url-redirect/index.ts","../../core/src/commands/server/access-deny/index.ts","../../core/src/commands/server/xpagespeed/index.ts","../../core/src/commands/server/auto-backup/index.ts","../../core/src/commands/server/mysql-backup/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 { registerResourceMonitorCommands } from './commands/server/resource-monitor/index.js';\r\nimport { registerWafCommands } from './commands/server/waf/index.js';\r\nimport { registerPhpIniCommands } from './commands/server/php-ini/index.js';\r\nimport { registerWordPressSecurityCommands } from './commands/server/wordpress-security/index.js';\r\nimport { registerXAcceleratorCommands } from './commands/server/x-accelerator/index.js';\r\nimport { registerServerCacheCommands } from './commands/server/server-cache/index.js';\r\nimport { registerBrowserCacheCommands } from './commands/server/browser-cache/index.js';\r\nimport { registerUrlRedirectCommands } from './commands/server/url-redirect/index.js';\r\nimport { registerAccessDenyCommands } from './commands/server/access-deny/index.js';\r\nimport { registerXPageSpeedCommands } from './commands/server/xpagespeed/index.js';\r\nimport { registerAutoBackupCommands } from './commands/server/auto-backup/index.js';\r\nimport { registerMysqlBackupCommands } from './commands/server/mysql-backup/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 registerResourceMonitorCommands(server, brand);\r\n registerWafCommands(server, brand);\r\n registerPhpIniCommands(server, brand);\r\n registerWordPressSecurityCommands(server, brand);\r\n registerXAcceleratorCommands(server, brand);\r\n registerServerCacheCommands(server, brand);\r\n registerBrowserCacheCommands(server, brand);\r\n registerUrlRedirectCommands(server, brand);\r\n registerAccessDenyCommands(server, brand);\r\n registerXPageSpeedCommands(server, brand);\r\n registerAutoBackupCommands(server, brand);\r\n registerMysqlBackupCommands(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 getResourceMonitor(date: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/resource-monitor`, { date });\r\n }\r\n\r\n // ================================================================\r\n // WAF設定\r\n // ================================================================\r\n\r\n async listWaf(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/waf`, params);\r\n }\r\n\r\n async updateWaf(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/waf/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // php.ini設定\r\n // ================================================================\r\n\r\n async listPhpIni(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-ini`, params);\r\n }\r\n\r\n async updatePhpIni(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-ini/${enc(domain)}`, data);\r\n }\r\n\r\n async resetPhpIni(domain: string): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/php-ini/${enc(domain)}/reset`);\r\n }\r\n\r\n // ================================================================\r\n // WordPressセキュリティ設定\r\n // ================================================================\r\n\r\n async getWordPressSecurity(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wordpress-security`, params);\r\n }\r\n\r\n async updateWordPressSecurity(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wordpress-security`, data);\r\n }\r\n\r\n // ================================================================\r\n // Xアクセラレータ設定\r\n // ================================================================\r\n\r\n async listXAccelerator(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/x-accelerator`, params);\r\n }\r\n\r\n async updateXAccelerator(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/x-accelerator/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // サーバーキャッシュ設定\r\n // ================================================================\r\n\r\n async listServerCache(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-cache`, params);\r\n }\r\n\r\n async updateServerCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/server-cache/${enc(domain)}`, data);\r\n }\r\n\r\n async clearServerCache(domain: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/server-cache/${enc(domain)}/cache`);\r\n }\r\n\r\n // ================================================================\r\n // ブラウザキャッシュ設定\r\n // ================================================================\r\n\r\n async listBrowserCache(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/browser-cache`, params);\r\n }\r\n\r\n async updateBrowserCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/browser-cache/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // サイト転送設定\r\n // ================================================================\r\n\r\n async listUrlRedirect(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/url-redirect`, params);\r\n }\r\n\r\n async addUrlRedirect(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/url-redirect`, data);\r\n }\r\n\r\n async deleteUrlRedirect(redirectId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/url-redirect/${enc(redirectId)}`);\r\n }\r\n\r\n // ================================================================\r\n // アクセス拒否設定\r\n // ================================================================\r\n\r\n async listAccessDeny(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-deny`, params);\r\n }\r\n\r\n async addAccessDeny(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/access-deny`, data);\r\n }\r\n\r\n async updateAccessDeny(denyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/access-deny/${enc(denyId)}`, data);\r\n }\r\n\r\n async deleteAccessDeny(denyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/access-deny/${enc(denyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // XPageSpeed設定\r\n // ================================================================\r\n\r\n async listXPageSpeed(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/xpagespeed`, params);\r\n }\r\n\r\n async updateXPageSpeed(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/xpagespeed/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // 自動バックアップの取得・復元\r\n // ================================================================\r\n\r\n async listAutoBackupBackupDates(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup/backup-dates`);\r\n }\r\n\r\n async listAutoBackup(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup`);\r\n }\r\n\r\n async getAutoBackup(requestId: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup/${enc(requestId)}`);\r\n }\r\n\r\n async createAutoBackup(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/auto-backup`, data);\r\n }\r\n\r\n // ================================================================\r\n // MySQLバックアップの取得・復元\r\n // ================================================================\r\n\r\n async listMysqlBackupDatabases(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup/databases`);\r\n }\r\n\r\n async listMysqlBackup(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup`);\r\n }\r\n\r\n async getMysqlBackup(requestId: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup/${enc(requestId)}`);\r\n }\r\n\r\n async createMysqlBackup(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mysql-backup`, data);\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キーを設定(対象サーバーが1台のキーはサーバー名を自動検出)')\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 } else if (!servername) {\r\n console.error(' このAPIキーは対象サーバーが固定されていません(「すべてのサーバー」等)。');\r\n console.error(' サーバー系コマンドでは --servername で対象を指定してください。');\r\n console.error(` 例: ${brand.commandName} server --servername <サーバーID> info`);\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 } else {\r\n console.log('サーバー名: 未固定(サーバー系コマンドでは --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}` : ' 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\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 [arrayKey, arrayValue] = arrayEntry;\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayKey);\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 const items = arrayValue as Record<string, unknown>[];\r\n if (items.length === 0) {\r\n // 一覧0件単体は (データなし)。他フィールドと併存する空配列は (0件)\r\n parts.push(scalarEntries.length > 0 ? `${arrayKey} (0件)` : '(データなし)');\r\n } else {\r\n parts.push(renderArrayTable(items));\r\n }\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 collectTableKeys(items: Record<string, unknown>[]): string[] {\r\n const keys: string[] = [];\r\n const seen = new Set<string>();\r\n for (const item of items) {\r\n for (const key of Object.keys(item)) {\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n keys.push(key);\r\n }\r\n }\r\n }\r\n return keys;\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 = collectTableKeys(items);\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 { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerResourceMonitorCommands(parent: Command, brand: BrandConfig): void {\r\n const resourceMonitor = parent\r\n .command('resource-monitor')\r\n .description('リソースモニター');\r\n\r\n resourceMonitor\r\n .command('get')\r\n .description('指定日のCPU・メモリ・転送量時系列を取得')\r\n .requiredOption('--date <date>', '対象日(Y-m-d または Ymd。当日含む直近1か月)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getResourceMonitor(opts.date), 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 registerWafCommands(parent: Command, brand: BrandConfig): void {\r\n const waf = parent\r\n .command('waf')\r\n .description('WAF設定');\r\n\r\n waf\r\n .command('list')\r\n .description('WAF設定一覧を取得')\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.listWaf(params), getFormat(parent));\r\n });\r\n\r\n waf\r\n .command('update <domain>')\r\n .description('WAF設定を更新(指定した項目のみ)')\r\n .option('--xss-protection <value>', 'XSS対策(true/false または 1/0)')\r\n .option('--sql-injection-protection <value>', 'SQL対策(true/false または 1/0)')\r\n .option('--file-protection <value>', 'ファイル対策(true/false または 1/0)')\r\n .option('--mail-protection <value>', 'メール対策(true/false または 1/0)')\r\n .option('--command-protection <value>', 'コマンド対策(true/false または 1/0)')\r\n .option('--php-protection <value>', 'PHP対策(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.xssProtection !== undefined) data.xss_protection = opts.xssProtection;\r\n if (opts.sqlInjectionProtection !== undefined) data.sql_injection_protection = opts.sqlInjectionProtection;\r\n if (opts.fileProtection !== undefined) data.file_protection = opts.fileProtection;\r\n if (opts.mailProtection !== undefined) data.mail_protection = opts.mailProtection;\r\n if (opts.commandProtection !== undefined) data.command_protection = opts.commandProtection;\r\n if (opts.phpProtection !== undefined) data.php_protection = opts.phpProtection;\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.updateWaf(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, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\n/** CLI kebab-case オプション名 → API ボディキー */\r\nconst PHP_INI_UPDATE_OPTIONS: { cli: string; api: string; desc: string }[] = [\r\n { cli: 'display-errors', api: 'display_errors', desc: 'エラー内容を画面に出力(On / Off)' },\r\n { cli: 'error-reporting', api: 'error_reporting', desc: 'エラー出力レベル' },\r\n { cli: 'display-startup-errors', api: 'display_startup_errors', desc: '起動時エラーを表示(On / Off)' },\r\n { cli: 'session-auto-start', api: 'session.auto_start', desc: 'セッション自動開始(0 / 1)' },\r\n { cli: 'session-name', api: 'session.name', desc: 'セッション名' },\r\n { cli: 'session-use-cookies', api: 'session.use_cookies', desc: 'セッションIDにクッキーを使用(0 / 1)' },\r\n { cli: 'session-use-only-cookies', api: 'session.use_only_cookies', desc: 'クッキーのみでセッションIDを保存(0 / 1)' },\r\n { cli: 'session-use-trans-sid', api: 'session.use_trans_sid', desc: 'URLへセッションIDを自動設定(0 / 1)' },\r\n { cli: 'session-cookie-lifetime', api: 'session.cookie_lifetime', desc: 'クッキー有効期間(秒)' },\r\n { cli: 'session-cookie-path', api: 'session.cookie_path', desc: 'クッキーを有効とするパス' },\r\n { cli: 'session-cookie-domain', api: 'session.cookie_domain', desc: 'クッキーを有効とするドメイン' },\r\n { cli: 'mbstring-language', api: 'mbstring.language', desc: 'デフォルト言語' },\r\n { cli: 'mbstring-internal-encoding', api: 'mbstring.internal_encoding', desc: '内部文字エンコーディング' },\r\n { cli: 'mbstring-http-input', api: 'mbstring.http_input', desc: 'HTTP入力文字エンコーディング変換' },\r\n { cli: 'mbstring-http-output', api: 'mbstring.http_output', desc: 'HTTP出力文字エンコーディング変換' },\r\n { cli: 'mbstring-encoding-translation', api: 'mbstring.encoding_translation', desc: '内部エンコーディングへの変換(On / Off)' },\r\n { cli: 'mbstring-detect-order', api: 'mbstring.detect_order', desc: '文字コード検出' },\r\n { cli: 'mbstring-substitute-character', api: 'mbstring.substitute_character', desc: '無効文字の代替文字' },\r\n { cli: 'max-execution-time', api: 'max_execution_time', desc: '最大実行時間(秒)' },\r\n { cli: 'max-input-time', api: 'max_input_time', desc: '入力パース最大時間(秒)' },\r\n { cli: 'memory-limit', api: 'memory_limit', desc: '最大メモリ' },\r\n { cli: 'post-max-size', api: 'post_max_size', desc: 'POSTデータ最大サイズ' },\r\n { cli: 'upload-max-filesize', api: 'upload_max_filesize', desc: 'アップロードファイル最大サイズ' },\r\n { cli: 'register-globals', api: 'register_globals', desc: 'register_globals(On / Off)' },\r\n { cli: 'magic-quotes-gpc', api: 'magic_quotes_gpc', desc: 'magic_quotes_gpc(On / Off)' },\r\n { cli: 'safe-mode', api: 'safe_mode', desc: 'safe_mode(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'file-uploads', api: 'file_uploads', desc: 'HTTPファイルアップロード(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-fopen', api: 'allow_url_fopen', desc: 'allow_url_fopen(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-include', api: 'allow_url_include', desc: 'allow_url_include(On / Off。user_ini_active が true のときは変更不可)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api } of PHP_INI_UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = value;\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerPhpIniCommands(parent: Command, brand: BrandConfig): void {\r\n const phpIni = parent\r\n .command('php-ini')\r\n .description('php.ini設定(php-version とは別)');\r\n\r\n phpIni\r\n .command('list')\r\n .description('php.ini設定を取得')\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.listPhpIni(params), getFormat(parent));\r\n });\r\n\r\n const update = phpIni\r\n .command('update <domain>')\r\n .description('php.ini設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of PHP_INI_UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpIni(domain, data), getFormat(parent));\r\n });\r\n\r\n phpIni\r\n .command('reset <domain>')\r\n .description('php.ini設定を初期値に戻す')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" の php.ini を初期値に戻します。この操作は取り消しできません。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetPhpIni(domain), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_BLOCKS = [\r\n 'comment_restriction',\r\n 'login_attempt_limit',\r\n 'foreign_ip_restriction',\r\n 'ip_restriction',\r\n] as const;\r\n\r\nconst UPDATE_OPTIONS: { cli: string; desc: string }[] = [\r\n { cli: 'comment-restriction-bulk-post-enabled', desc: '単一ユーザーからの大量投稿(true/false または 1/0)' },\r\n { cli: 'comment-restriction-foreign-post-enabled', desc: '国外からの投稿(true/false または 1/0)' },\r\n { cli: 'login-attempt-limit-enabled', desc: 'ログイン試行回数制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-enabled', desc: 'ダッシュボード アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-allowed-ips', desc: 'ダッシュボード アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-xml-rpc-api-enabled', desc: 'XML-RPC API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-xml-rpc-api-allowed-ips', desc: 'XML-RPC API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-rest-api-enabled', desc: 'REST API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-rest-api-allowed-ips', desc: 'REST API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-wlwmanifest-enabled', desc: 'wlwmanifest.xml アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-wlwmanifest-allowed-ips', desc: 'wlwmanifest.xml アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'ip-restriction-enabled', desc: 'IPアドレス制限(ダッシュボード)(true/false または 1/0)' },\r\n { cli: 'ip-restriction-allowed-ips', desc: 'IPアドレス制限のホワイトリスト(カンマ区切り IPv4 または CIDR。通常はクォート不要。空にする場合のみ \"\")' },\r\n];\r\n\r\nfunction parseIpAddressList(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\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction setForeignIpTarget(\r\n block: Record<string, unknown>,\r\n target: string,\r\n enabledLabel: string,\r\n enabled: string | undefined,\r\n allowedIps: string | undefined,\r\n): void {\r\n const entry: Record<string, unknown> = {};\r\n if (enabled !== undefined) entry.enabled = parseBooleanParam(enabledLabel, enabled);\r\n if (allowedIps !== undefined) entry.allowed_ip_addresses = parseIpAddressList(allowedIps);\r\n if (Object.keys(entry).length > 0) block[target] = entry;\r\n}\r\n\r\nfunction buildUpdateData(domain: string, opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = { domain };\r\n\r\n const commentRestriction: Record<string, unknown> = {};\r\n if (opts.commentRestrictionBulkPostEnabled !== undefined) {\r\n commentRestriction.bulk_post = {\r\n enabled: parseBooleanParam('単一ユーザーからの大量投稿', opts.commentRestrictionBulkPostEnabled as string),\r\n };\r\n }\r\n if (opts.commentRestrictionForeignPostEnabled !== undefined) {\r\n commentRestriction.foreign_post = {\r\n enabled: parseBooleanParam('国外からの投稿', opts.commentRestrictionForeignPostEnabled as string),\r\n };\r\n }\r\n if (Object.keys(commentRestriction).length > 0) {\r\n data.comment_restriction = commentRestriction;\r\n }\r\n\r\n if (opts.loginAttemptLimitEnabled !== undefined) {\r\n data.login_attempt_limit = {\r\n enabled: parseBooleanParam('ログイン試行回数制限', opts.loginAttemptLimitEnabled as string),\r\n };\r\n }\r\n\r\n const foreignIpRestriction: Record<string, unknown> = {};\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'dashboard',\r\n 'ダッシュボード アクセス制限',\r\n opts.foreignIpDashboardEnabled as string | undefined,\r\n opts.foreignIpDashboardAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'xml_rpc_api',\r\n 'XML-RPC API アクセス制限',\r\n opts.foreignIpXmlRpcApiEnabled as string | undefined,\r\n opts.foreignIpXmlRpcApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'rest_api',\r\n 'REST API アクセス制限',\r\n opts.foreignIpRestApiEnabled as string | undefined,\r\n opts.foreignIpRestApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'wlwmanifest',\r\n 'wlwmanifest.xml アクセス制限',\r\n opts.foreignIpWlwmanifestEnabled as string | undefined,\r\n opts.foreignIpWlwmanifestAllowedIps as string | undefined,\r\n );\r\n if (Object.keys(foreignIpRestriction).length > 0) {\r\n data.foreign_ip_restriction = foreignIpRestriction;\r\n }\r\n\r\n const ipRestriction: Record<string, unknown> = {};\r\n if (opts.ipRestrictionEnabled !== undefined) {\r\n ipRestriction.enabled = parseBooleanParam('IPアドレス制限(ダッシュボード)', opts.ipRestrictionEnabled as string);\r\n }\r\n if (opts.ipRestrictionAllowedIps !== undefined) {\r\n ipRestriction.allowed_ip_addresses = parseIpAddressList(opts.ipRestrictionAllowedIps as string);\r\n }\r\n if (Object.keys(ipRestriction).length > 0) {\r\n data.ip_restriction = ipRestriction;\r\n }\r\n\r\n if (!UPDATE_BLOCKS.some((key) => key in data)) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n return data;\r\n}\r\n\r\nexport function registerWordPressSecurityCommands(parent: Command, brand: BrandConfig): void {\r\n const wordpressSecurity = parent\r\n .command('wordpress-security')\r\n .description('WordPressセキュリティ設定');\r\n\r\n wordpressSecurity\r\n .command('get')\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.getWordPressSecurity(params), getFormat(parent));\r\n });\r\n\r\n const update = wordpressSecurity\r\n .command('update <domain>')\r\n .description('WordPressセキュリティ設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(domain, opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordPressSecurity(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\nexport function registerXAcceleratorCommands(parent: Command, brand: BrandConfig): void {\r\n const xAccelerator = parent\r\n .command('x-accelerator')\r\n .description('Xアクセラレータ設定');\r\n\r\n xAccelerator\r\n .command('list')\r\n .description('Xアクセラレータ設定一覧を取得')\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.listXAccelerator(params), getFormat(parent));\r\n });\r\n\r\n xAccelerator\r\n .command('update <domain>')\r\n .description('Xアクセラレータ設定を変更')\r\n .requiredOption('--xaccelerator-status <status>', 'Xアクセラレータ設定(off / v1 / v2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateXAccelerator(domain, { xaccelerator_status: opts.xacceleratorStatus }),\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 registerServerCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const serverCache = parent\r\n .command('server-cache')\r\n .description('サーバーキャッシュ設定');\r\n\r\n serverCache\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.listServerCache(params), getFormat(parent));\r\n });\r\n\r\n serverCache\r\n .command('update <domain>')\r\n .description('サーバーキャッシュ設定を変更')\r\n .requiredOption('--server-cache-status <status>', 'サーバーキャッシュ設定(on / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateServerCache(domain, { server_cache_status: opts.serverCacheStatus }),\r\n getFormat(parent),\r\n );\r\n });\r\n\r\n serverCache\r\n .command('clear-cache <domain>')\r\n .description('サーバーキャッシュの内容を削除(パージ)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" のサーバーキャッシュ内容を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.clearServerCache(domain), 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 registerBrowserCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const browserCache = parent\r\n .command('browser-cache')\r\n .description('ブラウザキャッシュ設定');\r\n\r\n browserCache\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.listBrowserCache(params), getFormat(parent));\r\n });\r\n\r\n browserCache\r\n .command('update <domain>')\r\n .description('ブラウザキャッシュ設定を変更')\r\n .requiredOption('--browser-cache-status <status>', 'ブラウザキャッシュ設定(all / ignore-css-js / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateBrowserCache(domain, { browser_cache_status: opts.browserCacheStatus }),\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 registerUrlRedirectCommands(parent: Command, brand: BrandConfig): void {\r\n const urlRedirect = parent\r\n .command('url-redirect')\r\n .description('サイト転送設定');\r\n\r\n urlRedirect\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.listUrlRedirect(params), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('add')\r\n .description('サイト転送設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--from-host <host>', '転送元ホスト(FQDN)')\r\n .option('--from-path <path>', '転送元パス(省略時は /。先頭が / でない場合は API 側で / を付与)')\r\n .requiredOption('--redirect-to-url <url>', '転送先URL(http または https)')\r\n .requiredOption('--status-code <code>', '転送時のステータスコード(301 / 302)')\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 from_host: opts.fromHost,\r\n redirect_to_url: opts.redirectToUrl,\r\n status_code: Number(opts.statusCode),\r\n };\r\n if (opts.fromPath !== undefined) data.from_path = opts.fromPath;\r\n printResult(await client.addUrlRedirect(data), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('delete <redirectId>')\r\n .description('サイト転送設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (redirectId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `サイト転送設定 \"${redirectId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteUrlRedirect(redirectId), 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 registerAccessDenyCommands(parent: Command, brand: BrandConfig): void {\r\n const accessDeny = parent\r\n .command('access-deny')\r\n .description('アクセス拒否設定');\r\n\r\n accessDeny\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.listAccessDeny(params), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('add')\r\n .description('アクセス拒否設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--ip-address <address>', '拒否IPアドレス・ホスト(IPv4 / CIDR / 部分IP / ホスト名)')\r\n .option('--memo <memo>', 'メモ(最大500文字)')\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 ip_address: opts.ipAddress,\r\n };\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addAccessDeny(data), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('update <denyId>')\r\n .description('アクセス拒否設定のメモを更新')\r\n .option('--memo <memo>', 'メモ(省略または空文字でクリア)')\r\n .action(async (denyId: string, opts) => {\r\n if (opts.memo === undefined) {\r\n throw new Error('--memo を指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAccessDeny(denyId, { memo: opts.memo }), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('delete <denyId>')\r\n .description('アクセス拒否設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (denyId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `アクセス拒否設定 \"${denyId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteAccessDeny(denyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_OPTIONS: { cli: string; api: string; label: string; desc: string }[] = [\r\n { cli: 'xoptimize-images', api: 'xoptimize_images', label: '画像最適化', desc: '画像最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-images', api: 'lazyload_images', label: '画像遅延読み込み', desc: '画像遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-css', api: 'xoptimize_css', label: 'CSS最適化', desc: 'CSS最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-css', api: 'lazyload_css', label: 'CSS遅延読み込み', desc: 'CSS遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-javascript', api: 'xoptimize_javascript', label: 'JavaScript最適化', desc: 'JavaScript最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-javascript', api: 'lazyload_javascript', label: 'JavaScript遅延読み込み', desc: 'JavaScript遅延読み込み(true/false または 1/0)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api, label } of UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = parseBooleanParam(label, value as string);\r\n }\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n if (Object.keys(data).length > 1) {\r\n throw new Error('1リクエストで変更できるのは1つの最適化機能のみです');\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerXPageSpeedCommands(parent: Command, brand: BrandConfig): void {\r\n const xPageSpeed = parent\r\n .command('xpagespeed')\r\n .description('XPageSpeed設定');\r\n\r\n xPageSpeed\r\n .command('list')\r\n .description('XPageSpeed設定一覧を取得')\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.listXPageSpeed(params), getFormat(parent));\r\n });\r\n\r\n const update = xPageSpeed\r\n .command('update <domain>')\r\n .description('XPageSpeedの最適化機能を変更(1リクエストで1機能のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateXPageSpeed(domain, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nconst DOMAIN_ELEMENT_TYPES = ['web', 'setting', 'mail'] as const;\r\n\r\nfunction validationError(...errors: string[]): never {\r\n throw new ApiError('入力値が正しくありません', 422, 'VALIDATION_ERROR', errors);\r\n}\r\n\r\n\r\nfunction collectFlagValue(value: string, previous: string[]): string[] {\r\n\r\n return previous.concat([value]);\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElementEntry(part: string): { domain: string; elements: string[] } {\r\n\r\n const equalIndex = part.indexOf('=');\r\n\r\n if (equalIndex === -1) {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const domain = part.slice(0, equalIndex).trim();\r\n\r\n const elementsRaw = part.slice(equalIndex + 1).trim();\r\n\r\n if (domain === '' || elementsRaw === '') {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const elements = elementsRaw.split(',').map((e) => e.trim()).filter((e) => e !== '');\r\n\r\n if (elements.length === 0) {\r\n\r\n validationError(`domain_elements の ${domain} に elements(${DOMAIN_ELEMENT_TYPES.join(', ')})を1件以上指定してください`);\r\n\r\n }\r\n\r\n\r\n\r\n return { domain, elements };\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElements(values: string[]): Array<{ domain: string; elements: string[] }> {\r\n\r\n if (values.length === 0) {\r\n\r\n validationError('scope が selected の場合、domain_elements を1件以上指定してください');\r\n\r\n }\r\n\r\n\r\n\r\n return values.map((value) => parseDomainElementEntry(value.trim()));\r\n\r\n}\r\n\r\n\r\n\r\nexport function registerAutoBackupCommands(parent: Command, brand: BrandConfig): void {\r\n\r\n const autoBackup = parent\r\n\r\n .command('auto-backup')\r\n\r\n .description('自動バックアップの取得・復元');\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('backup-dates')\r\n\r\n .description('選択可能なバックアップ日一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackupBackupDates(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('list')\r\n\r\n .description('自動バックアップ申込履歴一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackup(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('show <requestId>')\r\n\r\n .description('自動バックアップ申込履歴の詳細を取得')\r\n\r\n .action(async (requestId: string) => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.getAutoBackup(requestId), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('create')\r\n\r\n .description('自動バックアップの取得または復元を申し込む')\r\n\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n\r\n .requiredOption('--scope <scope>', '処理方法(all / selected)')\r\n\r\n .option(\r\n\r\n '--domain-elements <value>',\r\n\r\n '対象ドメイン・ディレクトリ(scope=selected のとき必須。繰り返し可)。形式: example.com=web,setting(elements: web / setting / mail)',\r\n\r\n collectFlagValue,\r\n\r\n [],\r\n\r\n )\r\n\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n\r\n .action(async (opts) => {\r\n\r\n const operationType = opts.operationType as string;\r\n\r\n const scope = opts.scope as string;\r\n\r\n\r\n\r\n if (operationType === 'restore') {\r\n\r\n await confirmDestructiveAction(\r\n\r\n parent,\r\n\r\n '自動バックアップの復元を申し込みます。サーバー上のデータが上書きされ、取り消しできません。よろしいですか?',\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const data: Record<string, unknown> = {\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\r\n scope,\r\n };\r\n\r\n const domainElementValues = opts.domainElements as string[];\r\n\r\n if (scope === 'selected') {\r\n if (domainElementValues.length === 0) {\r\n validationError('scope が selected の場合、--domain-elements を指定してください');\r\n }\r\n data.domain_elements = parseDomainElements(domainElementValues);\r\n } else if (domainElementValues.length > 0) {\r\n validationError('対象ドメイン・ディレクトリは 処理方法 が selected の場合のみ指定できます。');\r\n }\r\n\r\n\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.createAutoBackup(data), getFormat(parent));\r\n\r\n });\r\n\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 registerMysqlBackupCommands(parent: Command, brand: BrandConfig): void {\r\n const mysqlBackup = parent\r\n .command('mysql-backup')\r\n .description('MySQLバックアップの取得・復元');\r\n\r\n mysqlBackup\r\n .command('databases')\r\n .description('MySQLバックアップの状態を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackupDatabases(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('list')\r\n .description('MySQLバックアップ申込履歴一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackup(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('show <requestId>')\r\n .description('MySQLバックアップ申込履歴詳細を取得')\r\n .action(async (requestId: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMysqlBackup(requestId), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('create')\r\n .description('MySQLバックアップの取得または復元を申し込む')\r\n .requiredOption('--db-name <name>', 'データベース名')\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n .action(async (opts) => {\r\n const operationType = opts.operationType as string;\r\n\r\n if (operationType === 'restore') {\r\n await confirmDestructiveAction(\r\n parent,\r\n `データベース \"${opts.dbName}\" の MySQLバックアップ復元を申し込みます。対象 DB が上書きされ、取り消しできません。よろしいですか?`,\r\r\n );\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.createMysqlBackup({\r\n db_name: opts.dbName,\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\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 { 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\": \"shincloud-cli\",\n \"version\": \"1.2.1\",\n \"description\": \"Official CLI for Shincloud API — manage your Shincloud hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"shincloud\": \"./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 \"shincloud\",\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: 'shincloud',\r\n apiBase: 'https://api.shin-server.jp',\r\n displayName: 'シンクラウド API',\r\n commandName: 'shincloud',\r\n configDir: 'shincloud-cli',\r\n}, pkg.version);\r\n"],"mappings":"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","names":["path","buildUpdateData","UPDATE_OPTIONS","cliOptionToCamelCase","parseBooleanParam","buildUpdateData"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/index.ts","../../../shared/src/api-client.ts","../../../shared/src/brand-config.ts","../../../shared/src/domain-acquisition-permission.ts","../../core/src/commands/auth/login.ts","../../core/src/lib/config.ts","../../core/src/lib/api-base.ts","../../core/src/lib/auth-service-info.ts","../../core/src/lib/command-helper.ts","../../core/src/lib/output.ts","../../core/src/lib/resolve-servername-from-me.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/server/resource-monitor/index.ts","../../core/src/commands/server/waf/index.ts","../../core/src/commands/server/php-ini/index.ts","../../core/src/commands/server/wordpress-security/index.ts","../../core/src/commands/server/x-accelerator/index.ts","../../core/src/commands/server/server-cache/index.ts","../../core/src/commands/server/browser-cache/index.ts","../../core/src/commands/server/url-redirect/index.ts","../../core/src/commands/server/access-deny/index.ts","../../core/src/commands/server/xpagespeed/index.ts","../../core/src/commands/server/auto-backup/index.ts","../../core/src/commands/server/mysql-backup/index.ts","../../core/src/commands/me/index.ts","../../core/src/commands/domain/index.ts","../../core/src/lib/domain-validation.ts","../../core/src/commands/wphosting/index.ts","../../core/src/lib/wphosting-validation.ts","../package.json","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport type { BrandConfig } from 'xnp-shared';\nimport { ApiError } from 'xnp-shared';\nimport { registerAuthCommands } from './commands/auth/login.js';\nimport { registerServerInfoCommands } from './commands/server/info.js';\nimport { registerCronCommands } from './commands/server/cron/index.js';\nimport { registerWpCommands } from './commands/server/wp/index.js';\nimport { registerMailCommands } from './commands/server/mail/index.js';\nimport { registerSpamFilterCommands } from './commands/server/spam-filter/index.js';\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\nimport { registerAutoReplyCommands } from './commands/server/auto-reply/index.js';\nimport { registerSmtpAbroadRestrictionCommands } from './commands/server/smtp-abroad-restriction/index.js';\nimport { registerDkimCommands } from './commands/server/dkim/index.js';\nimport { registerDmarcCommands } from './commands/server/dmarc/index.js';\nimport { registerSpfCommands } from './commands/server/spf/index.js';\nimport { registerFtpCommands } from './commands/server/ftp/index.js';\nimport { registerDbCommands } from './commands/server/db/index.js';\nimport { registerPhpVersionCommands } from './commands/server/php-version/index.js';\nimport { registerServerDomainCommands } from './commands/server/domain/index.js';\nimport { registerSubdomainCommands } from './commands/server/subdomain/index.js';\nimport { registerSslCommands } from './commands/server/ssl/index.js';\nimport { registerDnsCommands } from './commands/server/dns/index.js';\nimport { registerSshCommands } from './commands/server/ssh/index.js';\nimport { registerLogCommands } from './commands/server/log/index.js';\nimport { registerResourceMonitorCommands } from './commands/server/resource-monitor/index.js';\nimport { registerWafCommands } from './commands/server/waf/index.js';\nimport { registerPhpIniCommands } from './commands/server/php-ini/index.js';\nimport { registerWordPressSecurityCommands } from './commands/server/wordpress-security/index.js';\nimport { registerXAcceleratorCommands } from './commands/server/x-accelerator/index.js';\nimport { registerServerCacheCommands } from './commands/server/server-cache/index.js';\nimport { registerBrowserCacheCommands } from './commands/server/browser-cache/index.js';\nimport { registerUrlRedirectCommands } from './commands/server/url-redirect/index.js';\nimport { registerAccessDenyCommands } from './commands/server/access-deny/index.js';\nimport { registerXPageSpeedCommands } from './commands/server/xpagespeed/index.js';\nimport { registerAutoBackupCommands } from './commands/server/auto-backup/index.js';\nimport { registerMysqlBackupCommands } from './commands/server/mysql-backup/index.js';\nimport { registerMeCommand } from './commands/me/index.js';\nimport { registerDomainCommands } from './commands/domain/index.js';\nimport { registerWphostingCommands } from './commands/wphosting/index.js';\nimport { isWphostingSupportedBrand } from './lib/wphosting-validation.js';\n\nexport type { BrandConfig } from 'xnp-shared';\nexport { isWphostingSupportedBrand } from './lib/wphosting-validation.js';\n\nexport function run(brand: BrandConfig, version = '0.0.0'): void {\n const program = new Command();\n\n program\n .name(brand.commandName)\n .description(`${brand.displayName} CLI`)\n .version(version)\n .option('--format <format>', '出力形式 (json, table)', (value: string) => {\n if (!['json', 'table'].includes(value)) {\n throw new Error(`--format は json または table を指定してください(入力値: ${value})`);\n }\n return value;\n }, 'table')\n .option('--profile <name>', '使用するプロファイル')\n .option('-y, --yes', '確認プロンプトをスキップ')\n .option('--debug', 'デバッグ出力を有効化(リクエストURL・レスポンスヘッダを表示)');\n\n registerAuthCommands(program, brand);\n registerMeCommand(program, brand);\n\n // WPhosting API(XServerブランド限定)\n if (isWphostingSupportedBrand(brand)) {\n const wphosting = program\n .command('wphosting')\n .description('XServer for WordPress API')\n .requiredOption('--contract-id <id>', 'WPhosting契約ID(例: WP-AB234567)');\n registerWphostingCommands(wphosting, brand);\n }\n\n // ドメインサービスAPI(/v1/domain)\n const domain = program\n .command('domain')\n .description('ドメインサービスAPI(取得・契約・DNS・Whoisなど)');\n registerDomainCommands(domain, brand);\n\n // サーバー管理API(/server/v1)\n const server = program\n .command('server')\n .description('サーバー管理API(WordPress・メール・DBなど)')\n .option('--servername <name>', 'サーバー名(プロファイルのデフォルトを上書き)');\n\n registerServerInfoCommands(server, brand);\n registerCronCommands(server, brand);\n registerSshCommands(server, brand);\n registerWpCommands(server, brand);\n registerMailCommands(server, brand);\n registerSpamFilterCommands(server, brand);\n registerMailFilterCommands(server, brand);\n registerAutoReplyCommands(server, brand);\n registerSmtpAbroadRestrictionCommands(server, brand);\n registerDkimCommands(server, brand);\n registerDmarcCommands(server, brand);\n registerSpfCommands(server, brand);\n registerFtpCommands(server, brand);\n registerDbCommands(server, brand);\n registerPhpVersionCommands(server, brand);\n registerServerDomainCommands(server, brand);\n registerSubdomainCommands(server, brand);\n registerSslCommands(server, brand);\n registerDnsCommands(server, brand);\n registerLogCommands(server, brand);\n registerResourceMonitorCommands(server, brand);\n registerWafCommands(server, brand);\n registerPhpIniCommands(server, brand);\n registerWordPressSecurityCommands(server, brand);\n registerXAcceleratorCommands(server, brand);\n registerServerCacheCommands(server, brand);\n registerBrowserCacheCommands(server, brand);\n registerUrlRedirectCommands(server, brand);\n registerAccessDenyCommands(server, brand);\n registerXPageSpeedCommands(server, brand);\n registerAutoBackupCommands(server, brand);\n registerMysqlBackupCommands(server, brand);\n\n program.parseAsync(process.argv).catch((err: unknown) => {\n if (err instanceof ApiError) {\n console.error(`エラー [${err.errorCode}]: ${err.message}`);\n if (err.errors.length > 0) {\n for (const e of err.errors) {\n console.error(` - ${e}`);\n }\n }\n // 通信ハンドルの終了処理を待てるよう、プロセスを即時終了しない。\n process.exitCode = 1;\n return;\n }\n if (err instanceof Error) {\n console.error(`エラー: ${err.message}`);\n process.exitCode = 1;\n return;\n }\n console.error('予期しないエラーが発生しました');\n process.exitCode = 1;\n });\n}\n","const DEFAULT_TIMEOUT_MS = 30_000;\nconst SENSITIVE_FIELD_PATTERN = /(?:password|passphrase|private_key|secret|token|user_pass|auth_code)$/i;\n\nfunction redactSensitiveValues(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveValues);\n if (typeof value !== 'object' || value === null) return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, child]) => [\n key,\n SENSITIVE_FIELD_PATTERN.test(key) ? '[REDACTED]' : redactSensitiveValues(child),\n ]),\n );\n}\n\nexport interface ApiErrorDetail {\n code: string;\n message: string;\n errors: string[];\n httpStatus: number;\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly httpStatus: number,\n public readonly errorCode: string,\n public readonly errors: string[],\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport interface RateLimitInfo {\n limit: number;\n remaining: number;\n reset: number;\n}\n\nexport interface ApiClientOptions {\n apiKey: string;\n apiBase: string;\n servername?: string;\n debug?: boolean;\n}\n\nexport class ApiClient {\n private readonly apiBase: string;\n private readonly apiKey: string;\n private readonly servername?: string;\n private readonly debug: boolean;\n public lastRateLimit: RateLimitInfo | null = null;\n\n constructor(opts: ApiClientOptions) {\n this.apiBase = opts.apiBase.replace(/\\/+$/, '');\n this.apiKey = opts.apiKey;\n this.servername = opts.servername;\n this.debug = opts.debug ?? false;\n }\n\n private serverPath(): string {\n if (!this.servername) {\n throw new Error('サーバー名が設定されていません。');\n }\n return `/v1/server/${encodeURIComponent(this.servername)}`;\n }\n\n // ================================================================\n // サーバー情報\n // ================================================================\n\n async getServerInfo(): Promise<unknown> {\n return this.get(`${this.serverPath()}/server-info`);\n }\n\n async getServerUsage(): Promise<unknown> {\n return this.get(`${this.serverPath()}/server-info/usage`);\n }\n\n // ================================================================\n // Cron\n // ================================================================\n\n async listCron(): Promise<unknown> {\n return this.get(`${this.serverPath()}/cron`);\n }\n\n async addCron(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/cron`, data);\n }\n\n async updateCron(cronId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/cron/${enc(cronId)}`, data);\n }\n\n async deleteCron(cronId: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/cron/${enc(cronId)}`);\n }\n\n // ================================================================\n // WordPress\n // ================================================================\n\n async listWordpress(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/wp`, params);\n }\n\n async addWordpress(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/wp`, data);\n }\n\n async updateWordpress(wpId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/wp/${enc(wpId)}`, data);\n }\n\n async deleteWordpress(wpId: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.delete(`${this.serverPath()}/wp/${enc(wpId)}`, data);\n }\n\n // ================================================================\n // メールアカウント\n // ================================================================\n\n async listMail(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/mail`, params);\n }\n\n async getMail(mailAccount: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}`);\n }\n\n async addMail(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/mail`, data);\n }\n\n async updateMail(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}`, data);\n }\n\n async deleteMail(mailAccount: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/mail/${enc(mailAccount)}`);\n }\n\n async getMailForwarding(mailAccount: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`);\n }\n\n async updateMailForwarding(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`, data);\n }\n\n // ================================================================\n // メール振り分け\n // ================================================================\n\n async listMailFilter(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/mail-filter`, params);\n }\n\n async addMailFilter(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/mail-filter`, data);\n }\n\n async deleteMailFilter(filterId: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);\n }\n\n // ================================================================\n // 迷惑メールフィルタ設定\n // ================================================================\n\n async listSpamFilter(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/spam-filter`, params);\n }\n\n async updateSpamFilter(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}`, data);\n }\n\n async updateSpamFilterDmarcReceiver(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}/dmarc-receiver`, data);\n }\n\n // ================================================================\n // 自動応答設定\n // ================================================================\n\n async listAutoReply(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/auto-reply`, params);\n }\n\n async getAutoReply(mailAddress: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\n }\n\n async addAutoReply(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/auto-reply`, data);\n }\n\n async updateAutoReply(mailAddress: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`, data);\n }\n\n async deleteAutoReply(mailAddress: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\n }\n\n // ================================================================\n // SMTP認証国外アクセス制限\n // ================================================================\n\n async listSmtpAbroadRestriction(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/smtp-abroad-restriction`, params);\n }\n\n async updateSmtpAbroadRestriction(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/smtp-abroad-restriction/${enc(domain)}`, data);\n }\n\n // ================================================================\n // DKIM設定\n // ================================================================\n\n async listDkim(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/dkim`, params);\n }\n\n async getDkim(fqdn: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/dkim/${enc(fqdn)}`);\n }\n\n async updateDkim(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/dkim/${enc(fqdn)}`, data);\n }\n\n // ================================================================\n // SPF設定\n // ================================================================\n\n async listSpf(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/spf`, params);\n }\n\n async addSpf(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/spf`, data);\n }\n\n async updateSpf(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/spf/${enc(fqdn)}`, data);\n }\n\n async deleteSpf(fqdn: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/spf/${enc(fqdn)}`);\n }\n\n // ================================================================\n // DMARC設定(送信側)\n // ================================================================\n\n async listDmarc(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/dmarc`, params);\n }\n\n async updateDmarc(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/dmarc/${enc(domain)}`, data);\n }\n\n // ================================================================\n // FTP\n // ================================================================\n\n async listFtp(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/ftp`, params);\n }\n\n async addFtp(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/ftp`, data);\n }\n\n async updateFtp(ftpAccount: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/ftp/${enc(ftpAccount)}`, data);\n }\n\n async deleteFtp(ftpAccount: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/ftp/${enc(ftpAccount)}`);\n }\n\n // ================================================================\n // MySQL\n // ================================================================\n\n async listDb(): Promise<unknown> {\n return this.get(`${this.serverPath()}/db`);\n }\n\n async addDb(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/db`, data);\n }\n\n async updateDb(dbName: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/db/${enc(dbName)}`, data);\n }\n\n async deleteDb(dbName: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/db/${enc(dbName)}`);\n }\n\n async listDbUser(): Promise<unknown> {\n return this.get(`${this.serverPath()}/db/user`);\n }\n\n async addDbUser(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/db/user`, data);\n }\n\n async updateDbUser(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/db/user/${enc(dbUser)}`, data);\n }\n\n async deleteDbUser(dbUser: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}`);\n }\n\n async listDbUserGrant(dbUser: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`);\n }\n\n async addDbUserGrant(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\n }\n\n async deleteDbUserGrant(dbUser: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\n }\n\n // ================================================================\n // PHP バージョン\n // ================================================================\n\n async getPhpVersion(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/php-version`, params);\n }\n\n async updatePhpVersion(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/php-version/${enc(domain)}`, data);\n }\n\n // ================================================================\n // ドメイン(サーバーパネル)\n // ================================================================\n\n async listDomain(): Promise<unknown> {\n return this.get(`${this.serverPath()}/domain`);\n }\n\n async getDomain(domain: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/domain/${enc(domain)}`);\n }\n\n async addDomain(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/domain`, data);\n }\n\n async updateDomain(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/domain/${enc(domain)}`, data);\n }\n\n async deleteDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.delete(`${this.serverPath()}/domain/${enc(domain)}`, data);\n }\n\n async resetDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/domain/${enc(domain)}/reset`, data);\n }\n\n // ================================================================\n // サブドメイン\n // ================================================================\n\n async listSubdomain(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/subdomain`, params);\n }\n\n async addSubdomain(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/subdomain`, data);\n }\n\n async updateSubdomain(subdomain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\n }\n\n async deleteSubdomain(subdomain: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.delete(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\n }\n\n // ================================================================\n // SSL\n // ================================================================\n\n async listSsl(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/ssl`, params);\n }\n\n async installSsl(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/ssl`, data);\n }\n\n async uninstallSsl(commonName: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/ssl/${enc(commonName)}`);\n }\n\n // ================================================================\n // DNS(サーバーパネル)\n // ================================================================\n\n async listDns(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/dns`, params);\n }\n\n async addDns(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/dns`, data);\n }\n\n async updateDns(dnsId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\n }\n\n async deleteDns(dnsId: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.delete(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\n }\n\n // ================================================================\n // SSH\n // ================================================================\n\n async getSsh(): Promise<unknown> {\n return this.get(`${this.serverPath()}/ssh`);\n }\n\n async updateSsh(data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/ssh`, data);\n }\n\n async listSshKey(): Promise<unknown> {\n return this.get(`${this.serverPath()}/ssh/key`);\n }\n\n async addSshKey(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/ssh/key`, data);\n }\n\n async updateSshKey(keyId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/ssh/key/${enc(keyId)}`, data);\n }\n\n async deleteSshKey(keyId: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/ssh/key/${enc(keyId)}`);\n }\n\n // ================================================================\n // リソースモニター\n // ================================================================\n\n async getResourceMonitor(date: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/resource-monitor`, { date });\n }\n\n // ================================================================\n // WAF設定\n // ================================================================\n\n async listWaf(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/waf`, params);\n }\n\n async updateWaf(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/waf/${enc(domain)}`, data);\n }\n\n // ================================================================\n // php.ini設定\n // ================================================================\n\n async listPhpIni(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/php-ini`, params);\n }\n\n async updatePhpIni(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/php-ini/${enc(domain)}`, data);\n }\n\n async resetPhpIni(domain: string): Promise<unknown> {\n return this.post(`${this.serverPath()}/php-ini/${enc(domain)}/reset`);\n }\n\n // ================================================================\n // WordPressセキュリティ設定\n // ================================================================\n\n async getWordPressSecurity(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/wordpress-security`, params);\n }\n\n async updateWordPressSecurity(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/wordpress-security`, data);\n }\n\n // ================================================================\n // Xアクセラレータ設定\n // ================================================================\n\n async listXAccelerator(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/x-accelerator`, params);\n }\n\n async updateXAccelerator(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/x-accelerator/${enc(domain)}`, data);\n }\n\n // ================================================================\n // サーバーキャッシュ設定\n // ================================================================\n\n async listServerCache(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/server-cache`, params);\n }\n\n async updateServerCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/server-cache/${enc(domain)}`, data);\n }\n\n async clearServerCache(domain: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/server-cache/${enc(domain)}/cache`);\n }\n\n // ================================================================\n // ブラウザキャッシュ設定\n // ================================================================\n\n async listBrowserCache(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/browser-cache`, params);\n }\n\n async updateBrowserCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/browser-cache/${enc(domain)}`, data);\n }\n\n // ================================================================\n // サイト転送設定\n // ================================================================\n\n async listUrlRedirect(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/url-redirect`, params);\n }\n\n async addUrlRedirect(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/url-redirect`, data);\n }\n\n async deleteUrlRedirect(redirectId: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/url-redirect/${enc(redirectId)}`);\n }\n\n // ================================================================\n // アクセス拒否設定\n // ================================================================\n\n async listAccessDeny(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/access-deny`, params);\n }\n\n async addAccessDeny(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/access-deny`, data);\n }\n\n async updateAccessDeny(denyId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/access-deny/${enc(denyId)}`, data);\n }\n\n async deleteAccessDeny(denyId: string): Promise<unknown> {\n return this.delete(`${this.serverPath()}/access-deny/${enc(denyId)}`);\n }\n\n // ================================================================\n // XPageSpeed設定\n // ================================================================\n\n async listXPageSpeed(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/xpagespeed`, params);\n }\n\n async updateXPageSpeed(domain: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.serverPath()}/xpagespeed/${enc(domain)}`, data);\n }\n\n // ================================================================\n // 自動バックアップの取得・復元\n // ================================================================\n\n async listAutoBackupBackupDates(): Promise<unknown> {\n return this.get(`${this.serverPath()}/auto-backup/backup-dates`);\n }\n\n async listAutoBackup(): Promise<unknown> {\n return this.get(`${this.serverPath()}/auto-backup`);\n }\n\n async getAutoBackup(requestId: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/auto-backup/${enc(requestId)}`);\n }\n\n async createAutoBackup(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/auto-backup`, data);\n }\n\n // ================================================================\n // MySQLバックアップの取得・復元\n // ================================================================\n\n async listMysqlBackupDatabases(): Promise<unknown> {\n return this.get(`${this.serverPath()}/mysql-backup/databases`);\n }\n\n async listMysqlBackup(): Promise<unknown> {\n return this.get(`${this.serverPath()}/mysql-backup`);\n }\n\n async getMysqlBackup(requestId: string): Promise<unknown> {\n return this.get(`${this.serverPath()}/mysql-backup/${enc(requestId)}`);\n }\n\n async createMysqlBackup(data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.serverPath()}/mysql-backup`, data);\n }\n\n // ================================================================\n // ログ\n // ================================================================\n\n async getAccessLog(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/access-log`, params);\n }\n\n async getErrorLog(params?: Record<string, string>): Promise<unknown> {\n return this.get(`${this.serverPath()}/error-log`, params);\n }\n\n // ================================================================\n // APIキー情報\n // ================================================================\n\n async getMe(): Promise<unknown> {\n return this.get('/v1/me');\n }\n\n // ================================================================\n // ドメインサービスAPI(/v1/domain・servername非依存)\n // ================================================================\n\n private domainPath(domainName: string): string {\n return `/v1/domain/${enc(domainName)}`;\n }\n\n async listDomains(): Promise<unknown> {\n return this.get('/v1/domain');\n }\n\n async getDomainDetail(domainName: string): Promise<unknown> {\n return this.get(this.domainPath(domainName));\n }\n\n async getDomainNameservers(domainName: string): Promise<unknown> {\n return this.get(`${this.domainPath(domainName)}/nameservers`);\n }\n\n async updateDomainNameservers(domainName: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.domainPath(domainName)}/nameservers`, data);\n }\n\n async getDomainWhois(domainName: string): Promise<unknown> {\n return this.get(`${this.domainPath(domainName)}/whois`);\n }\n\n async updateDomainWhois(domainName: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.domainPath(domainName)}/whois`, data);\n }\n\n async getDomainRegistrarLock(domainName: string): Promise<unknown> {\n return this.get(`${this.domainPath(domainName)}/registrar-lock`);\n }\n\n async updateDomainRegistrarLock(domainName: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.domainPath(domainName)}/registrar-lock`, data);\n }\n\n async listDomainDns(domainName: string): Promise<unknown> {\n return this.get(`${this.domainPath(domainName)}/dns`);\n }\n\n async addDomainDns(domainName: string, data: Record<string, unknown>): Promise<unknown> {\n return this.post(`${this.domainPath(domainName)}/dns`, data);\n }\n\n async updateDomainDns(domainName: string, dnsId: string, data: Record<string, unknown>): Promise<unknown> {\n return this.put(`${this.domainPath(domainName)}/dns/${enc(dnsId)}`, data);\n }\n\n async deleteDomainDns(domainName: string, dnsId: string): Promise<unknown> {\n return this.delete(`${this.domainPath(domainName)}/dns/${enc(dnsId)}`);\n }\n\n async checkDomain(domainName: string): Promise<unknown> {\n return this.get('/v1/domain/check', { domain_name: domainName });\n }\n\n async getDomainPricing(params?: Record<string, string>): Promise<unknown> {\n return this.get('/v1/domain/pricing', params);\n }\n\n async registerDomain(data: Record<string, unknown>, idempotencyKey?: string): Promise<unknown> {\n return this.post('/v1/domain', data, idempotencyHeaders(idempotencyKey));\n }\n\n async transferDomain(\n domainName: string,\n data: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.domainPath(domainName)}/transfer`,\n data,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async renewDomain(\n domainName: string,\n data: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.domainPath(domainName)}/renew`,\n data,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n // ================================================================\n // WPhosting API(/v1/wphosting/{contract_id})\n // ================================================================\n\n private wphostingPath(contractId: string): string {\n return `/v1/wphosting/${enc(contractId)}`;\n }\n\n private wphostingSitePath(contractId: string, servername: string): string {\n return `${this.wphostingPath(contractId)}/sites/${enc(servername)}`;\n }\n\n async listWphostingSites(contractId: string): Promise<unknown> {\n return this.get(`${this.wphostingPath(contractId)}/sites`);\n }\n\n async getWphostingSite(contractId: string, servername: string): Promise<unknown> {\n return this.get(this.wphostingSitePath(contractId, servername));\n }\n\n async createWphostingSite(\n contractId: string,\n data: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingPath(contractId)}/sites`,\n data,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async deleteWphostingSite(\n contractId: string,\n servername: string,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.delete(\n this.wphostingSitePath(contractId, servername),\n undefined,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async getWphostingUsage(contractId: string): Promise<unknown> {\n return this.get(`${this.wphostingPath(contractId)}/usage`);\n }\n\n async createWphostingStaging(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/staging`,\n data,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async listWphostingBackups(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/backups`);\n }\n\n async createWphostingBackup(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/backups`,\n data,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async restoreWphostingBackup(\n contractId: string,\n servername: string,\n backupId: string,\n idempotencyKey?: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/backups/${enc(backupId)}/restore`,\n undefined,\n idempotencyHeaders(idempotencyKey),\n );\n }\n\n async listWphostingBackupRestoreHistory(\n contractId: string,\n servername: string,\n ): Promise<unknown> {\n return this.get(\n `${this.wphostingSitePath(contractId, servername)}/backups/restore-history`,\n );\n }\n\n async deleteWphostingBackup(\n contractId: string,\n servername: string,\n backupId: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/backups/${enc(backupId)}`,\n );\n }\n\n async getWphostingWordPress(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/wordpress`);\n }\n\n async updateWphostingWordPress(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(`${this.wphostingSitePath(contractId, servername)}/wordpress`, data);\n }\n\n async upgradeWphostingWordPress(\n contractId: string,\n servername: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/wordpress/update`,\n );\n }\n\n async getWphostingMaintenanceMode(\n contractId: string,\n servername: string,\n ): Promise<unknown> {\n return this.get(\n `${this.wphostingSitePath(contractId, servername)}/maintenance-mode`,\n );\n }\n\n async updateWphostingMaintenanceMode(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/maintenance-mode`,\n data,\n );\n }\n\n async listWphostingPlugins(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/plugins`);\n }\n\n async installWphostingPlugin(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/plugins`, data);\n }\n\n async updateWphostingPlugin(\n contractId: string,\n servername: string,\n plugin: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/plugins/${enc(plugin)}`,\n data,\n );\n }\n\n async upgradeWphostingPlugin(\n contractId: string,\n servername: string,\n plugin: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/plugins/${enc(plugin)}/update`,\n );\n }\n\n async deleteWphostingPlugin(\n contractId: string,\n servername: string,\n plugin: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/plugins/${enc(plugin)}`,\n );\n }\n\n async listWphostingThemes(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/themes`);\n }\n\n async installWphostingTheme(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/themes`, data);\n }\n\n async updateWphostingTheme(\n contractId: string,\n servername: string,\n theme: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/themes/${enc(theme)}`,\n data,\n );\n }\n\n async upgradeWphostingTheme(\n contractId: string,\n servername: string,\n theme: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/themes/${enc(theme)}/update`,\n );\n }\n\n async deleteWphostingTheme(\n contractId: string,\n servername: string,\n theme: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/themes/${enc(theme)}`,\n );\n }\n\n async listWphostingDomains(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/domains`);\n }\n\n async addWphostingDomain(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/domains`, data);\n }\n\n async verifyWphostingDomain(\n contractId: string,\n servername: string,\n domain: string,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}/verify`,\n );\n }\n\n async deleteWphostingDomain(\n contractId: string,\n servername: string,\n domain: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}`,\n );\n }\n\n async updateWphostingSiteUrl(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(`${this.wphostingSitePath(contractId, servername)}/site-url`, data);\n }\n\n async listWphostingDnsRecords(\n contractId: string,\n servername: string,\n domain: string,\n ): Promise<unknown> {\n return this.get(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}/dns`,\n );\n }\n\n async addWphostingDnsRecord(\n contractId: string,\n servername: string,\n domain: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}/dns`,\n data,\n );\n }\n\n async updateWphostingDnsRecord(\n contractId: string,\n servername: string,\n domain: string,\n dnsId: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}/dns/${enc(dnsId)}`,\n data,\n );\n }\n\n async deleteWphostingDnsRecord(\n contractId: string,\n servername: string,\n domain: string,\n dnsId: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/domains/${enc(domain)}/dns/${enc(dnsId)}`,\n );\n }\n\n async getWphostingPhpVersion(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/php-version`);\n }\n\n async updateWphostingPhpVersion(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/php-version`,\n data,\n );\n }\n\n async getWphostingAccessLog(\n contractId: string,\n servername: string,\n params?: Record<string, string>,\n ): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/access-log`, params);\n }\n\n async getWphostingErrorLog(\n contractId: string,\n servername: string,\n params?: Record<string, string>,\n ): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/error-log`, params);\n }\n\n async listWphostingCron(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/cron`);\n }\n\n async addWphostingCron(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/cron`, data);\n }\n\n async updateWphostingCron(\n contractId: string,\n servername: string,\n cronId: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/cron/${enc(cronId)}`,\n data,\n );\n }\n\n async deleteWphostingCron(\n contractId: string,\n servername: string,\n cronId: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/cron/${enc(cronId)}`,\n );\n }\n\n async getWphostingSsh(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/ssh`);\n }\n\n async updateWphostingSsh(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(`${this.wphostingSitePath(contractId, servername)}/ssh`, data);\n }\n\n async listWphostingSshKeys(contractId: string, servername: string): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/ssh/key`);\n }\n\n async addWphostingSshKey(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/ssh/key`, data);\n }\n\n async updateWphostingSshKey(\n contractId: string,\n servername: string,\n keyId: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/ssh/key/${enc(keyId)}`,\n data,\n );\n }\n\n async deleteWphostingSshKey(\n contractId: string,\n servername: string,\n keyId: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/ssh/key/${enc(keyId)}`,\n );\n }\n\n async listWphostingWpUserRoles(\n contractId: string,\n servername: string,\n ): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/wp-users/roles`);\n }\n\n async listWphostingWpUsers(\n contractId: string,\n servername: string,\n params?: Record<string, string>,\n ): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/wp-users`, params);\n }\n\n async createWphostingWpUser(\n contractId: string,\n servername: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.post(`${this.wphostingSitePath(contractId, servername)}/wp-users`, data);\n }\n\n async getWphostingWpUser(\n contractId: string,\n servername: string,\n userId: string,\n ): Promise<unknown> {\n return this.get(\n `${this.wphostingSitePath(contractId, servername)}/wp-users/${enc(userId)}`,\n );\n }\n\n async updateWphostingWpUser(\n contractId: string,\n servername: string,\n userId: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/wp-users/${enc(userId)}`,\n data,\n );\n }\n\n async deleteWphostingWpUser(\n contractId: string,\n servername: string,\n userId: string,\n ): Promise<unknown> {\n return this.delete(\n `${this.wphostingSitePath(contractId, servername)}/wp-users/${enc(userId)}`,\n );\n }\n\n async getWphostingSecurity(\n contractId: string,\n servername: string,\n ): Promise<unknown> {\n return this.get(`${this.wphostingSitePath(contractId, servername)}/security`);\n }\n\n async updateWphostingSecurity(\n contractId: string,\n servername: string,\n key: string,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n return this.put(\n `${this.wphostingSitePath(contractId, servername)}/security/${enc(key)}`,\n data,\n );\n }\n\n // ================================================================\n // HTTP 基盤\n // ================================================================\n\n async get(path: string, params?: Record<string, string>): Promise<unknown> {\n let url = `${this.apiBase}${path}`;\n if (params && Object.keys(params).length > 0) {\n url += '?' + new URLSearchParams(params).toString();\n }\n return this.request('GET', url);\n }\n\n async post(\n path: string,\n data?: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<unknown> {\n return this.request('POST', `${this.apiBase}${path}`, data, headers);\n }\n\n async put(path: string, data?: Record<string, unknown>): Promise<unknown> {\n return this.request('PUT', `${this.apiBase}${path}`, data);\n }\n\n async delete(\n path: string,\n data?: Record<string, unknown>,\n headers?: Record<string, string>,\n ): Promise<unknown> {\n return this.request('DELETE', `${this.apiBase}${path}`, data, headers);\n }\n\n private async request(\n method: string,\n url: string,\n body?: Record<string, unknown>,\n additionalHeaders?: Record<string, string>,\n ): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Accept': 'application/json',\n ...additionalHeaders,\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\n };\n\n if (body && method !== 'GET') {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(body);\n }\n\n if (this.debug) {\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\n dbg(`${method} ${url}`);\n if (body) dbg(`Body: ${JSON.stringify(redactSensitiveValues(body))}`);\n }\n\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch (err) {\n throw new Error(`通信エラー: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (this.debug) {\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\n dbg(`HTTP ${response.status} ${response.statusText}`);\n const debugHeaders = ['x-ratelimit-limit', 'x-ratelimit-remaining', 'x-ratelimit-reset', 'x-concurrent-limit', 'x-concurrent-remaining', 'content-type'];\n for (const h of debugHeaders) {\n const v = response.headers.get(h);\n if (v !== null) dbg(` ${h}: ${v}`);\n }\n }\n\n const rateLimitHeader = response.headers.get('x-ratelimit-limit');\n if (rateLimitHeader) {\n this.lastRateLimit = {\n limit: parseInt(rateLimitHeader, 10),\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\n };\n }\n\n const text = await response.text();\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n if (this.debug) {\n process.stderr.write(`[DEBUG] Raw response: ${text.substring(0, 500)}\\n`);\n }\n throw new ApiError(`Response parse error (HTTP ${response.status})`, response.status, 'PARSE_ERROR', []);\n }\n\n if (!response.ok) {\n const err = data as { error?: { code?: string; message?: string; errors?: string[] } };\n const errorCode = err?.error?.code || 'UNKNOWN_ERROR';\n const errorMessage = err?.error?.message || 'エラーが発生しました';\n const errors = err?.error?.errors || [];\n throw new ApiError(errorMessage, response.status, errorCode, errors);\n }\n\n return data;\n }\n}\n\nfunction enc(s: string): string {\n return encodeURIComponent(s);\n}\n\nfunction idempotencyHeaders(idempotencyKey?: string): Record<string, string> | undefined {\n return idempotencyKey === undefined\n ? undefined\n : { 'Idempotency-Key': idempotencyKey };\n}\n","/**\r\n * ブランド差分設定。\r\n * CLI/MCP の各ブランドパッケージから run() に渡される。\r\n */\r\nexport interface BrandConfig {\r\n /** 内部ID。環境変数のプレフィックスや brand キー判定に使用 */\r\n brand: string;\r\n /** API ベースURL */\r\n apiBase: string;\r\n /** ユーザー向け表示名(例: \"XServer\", \"シンクラウド\", \"Star8\") */\r\n displayName: string;\r\n /** Domainサービス利用規約URL */\r\n domainTermsUrl: string;\r\n /** Domainサービスの個人情報の取り扱いについてのURL */\r\n domainPrivacyUrl: string;\r\n /** CLIコマンド名(CLI専用、MCPでは無視されてOK) */\r\n commandName: string;\r\n /** 設定ファイル保存先ディレクトリ名(CLI専用) */\r\n configDir: string;\r\n}\r\n\r\nexport function domainLegalNoticeLines(\r\n brand: Pick<BrandConfig, 'domainTermsUrl' | 'domainPrivacyUrl'>,\r\n): string[] {\r\n return [\r\n `サービス利用規約: ${brand.domainTermsUrl}`,\r\n `個人情報の取り扱いについて: ${brand.domainPrivacyUrl}`,\r\n ];\r\n}\r\n","import { ApiError } from './api-client.js';\r\n\r\ntype UnknownRecord = Record<string, unknown>;\r\n\r\nexport interface DomainPermissionClient {\r\n getMe(): Promise<unknown>;\r\n}\r\n\r\nfunction record(value: unknown): UnknownRecord | undefined {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as UnknownRecord) : undefined;\r\n}\r\n\r\nfunction diagnosedForbidden(message: string): ApiError {\r\n return new ApiError(message, 403, 'FORBIDDEN', []);\r\n}\r\n\r\n/**\r\n * Domainの取得関連APIがFORBIDDENになった場合だけ /v1/me を参照し、\r\n * サービス未許可またはallow_acquisition=falseを利用者向けに診断する。\r\n * 診断できない場合は、原因を誤分類しないよう元のApiErrorを維持する。\r\n */\r\nexport async function withDomainAcquisitionPermissionDiagnosis<T>(\r\n client: DomainPermissionClient,\r\n request: () => Promise<T>,\r\n): Promise<T> {\r\n try {\r\n return await request();\r\n } catch (error) {\r\n if (!(error instanceof ApiError) || error.httpStatus !== 403 || error.errorCode !== 'FORBIDDEN') {\r\n throw error;\r\n }\r\n\r\n let meData: UnknownRecord;\r\n try {\r\n meData = (await client.getMe()) as UnknownRecord;\r\n } catch {\r\n throw error;\r\n }\r\n\r\n const services = record(meData.services);\r\n const domain = record(services?.domain);\r\n if (!domain) {\r\n throw diagnosedForbidden(\r\n 'このAPIキーではDomain APIを利用できません。Domainサービスを含むAPIキーを使用してください。',\r\n );\r\n }\r\n if (domain.allow_acquisition === false) {\r\n throw diagnosedForbidden(\r\n 'このAPIキーでは、ドメインの取得可能性・価格確認・新規取得・移管・契約更新が許可されていません。' +\r\n 'APIキー管理画面で「このキーでドメインの新規取得・移管・更新(お申し込み)を許可する」を有効にしたAPIキーを使用してください。',\r\n );\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","import { Command } from 'commander';\nimport { password, select } from '@inquirer/prompts';\nimport type { BrandConfig } from 'xnp-shared';\nimport { ApiClient, ApiError } from 'xnp-shared';\nimport { loadConfig, saveConfig } from '../../lib/config.js';\nimport { resolveApiBase } from '../../lib/api-base.js';\nimport {\n formatAuthApiKeyInfo,\n hasAuthService,\n NO_DEFAULT_SERVER,\n parseAuthApiKeyInfo,\n servernameChoices,\n} from '../../lib/auth-service-info.js';\nimport { getFormat, printResult } from '../../lib/command-helper.js';\nimport {\n manualServernameMessage,\n resolveServernameFromMe,\n} from '../../lib/resolve-servername-from-me.js';\n\nfunction maskApiKey(apiKey: string): string {\n return `${apiKey.substring(0, 8)}...`;\n}\n\nasync function resolveLoginServername(\n meData: Record<string, unknown>,\n brand: BrandConfig,\n): Promise<string | undefined> {\n const outcome = resolveServernameFromMe(meData);\n\n if (outcome.status === 'auto') {\n console.error(` サーバー名を自動検出しました: ${outcome.servername}`);\n return outcome.servername;\n }\n\n if (outcome.status === 'choose') {\n if (process.stdin.isTTY) {\n const chosen = await select({\n message: 'サーバー系コマンドの既定サーバーを選択:',\n choices: servernameChoices(outcome.targets),\n });\n if (chosen === NO_DEFAULT_SERVER) {\n console.error(' サーバー名: 未固定(コマンド実行時に --servername で指定)');\n return undefined;\n }\n console.error(` サーバー名: ${chosen}`);\n return chosen;\n }\n\n console.error(' 対象サーバーが複数あるため自動検出できません。--servername で指定してください。');\n console.error(` 候補: ${outcome.targets.join(', ')}`);\n console.error(' サーバー系コマンドでは --servername で対象を指定してください。');\n console.error(` 例: ${brand.commandName} server --servername <サーバーID> info`);\n return undefined;\n }\n\n console.error(` ${manualServernameMessage(outcome.reason)}`);\n console.error(' サーバー系コマンドでは --servername で対象を指定してください。');\n console.error(` 例: ${brand.commandName} server --servername <サーバーID> info`);\n return undefined;\n}\n\nexport function registerAuthCommands(program: Command, brand: BrandConfig): void {\n const auth = program\n .command('auth')\n .description('認証設定');\n\n auth\n .command('login')\n .description('APIキーを検証し、利用可能サービスと認証設定を保存')\n .option('--api-key <key>', 'APIキー')\n .option('--servername <name>', 'サーバー名(自動検出を上書き)')\n .action(async (opts: { apiKey?: string; servername?: string }, cmd: Command) => {\n const profileName: string = (cmd.optsWithGlobals().profile as string | undefined) ?? 'default';\n let apiKey = opts.apiKey;\n let servername = opts.servername;\n\n if (!apiKey) {\n apiKey = await password({ message: 'APIキーを入力:', mask: true });\n }\n if (!apiKey) {\n console.error('エラー: APIキーは必須です');\n process.exit(1);\n }\n\n console.error('認証情報を検証中...');\n const apiBase = resolveApiBase(brand);\n const client = new ApiClient({ apiKey, apiBase });\n let meData: Record<string, unknown>;\n try {\n meData = await client.getMe() as Record<string, unknown>;\n } catch (err) {\n if (err instanceof ApiError && err.errorCode === 'UNAUTHORIZED') {\n console.error('エラー: APIキーが無効です。正しいAPIキーを指定してください。');\n process.exit(1);\n }\n throw err;\n }\n console.error('✓ 認証に成功しました');\n\n const apiKeyInfo = parseAuthApiKeyInfo(meData);\n console.error('');\n for (const line of formatAuthApiKeyInfo(apiKeyInfo)) {\n console.error(line);\n }\n console.error('');\n\n if (!servername && hasAuthService(apiKeyInfo, 'server')) {\n servername = await resolveLoginServername(meData, brand);\n }\n\n const config = loadConfig(brand);\n config.profiles[profileName] = {\n apiKey,\n ...(servername ? { servername } : {}),\n };\n if (!config.defaultProfile) {\n config.defaultProfile = profileName;\n }\n saveConfig(brand, config);\n\n console.error(`✓ プロファイル \"${profileName}\" を保存しました`);\n console.error(` 設定ファイル: ~/.config/${brand.configDir}/config.json`);\n });\n\n auth\n .command('status')\n .description('現在の認証状態を表示')\n .action((_opts: Record<string, unknown>, cmd: Command) => {\n const format = getFormat(cmd);\n const config = loadConfig(brand);\n const profileName = (cmd.optsWithGlobals().profile as string | undefined) || config.defaultProfile || 'default';\n const profile = config.profiles[profileName];\n\n if (!profile) {\n if (format === 'json') {\n printResult({\n authenticated: false,\n profile: profileName,\n message: `プロファイル \"${profileName}\" が見つかりません`,\n }, format);\n } else {\n console.error(`プロファイル \"${profileName}\" が見つかりません`);\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\n }\n process.exit(1);\n }\n\n if (format === 'json') {\n printResult({\n authenticated: true,\n profile: profileName,\n api_key: maskApiKey(profile.apiKey),\n servername: profile.servername ?? null,\n api_base: resolveApiBase(brand),\n }, format);\n return;\n }\n\n console.log(`プロファイル: ${profileName}`);\n console.log(`APIキー: ${maskApiKey(profile.apiKey)}`);\n if (profile.servername) {\n console.log(`サーバー名: ${profile.servername}`);\n } else {\n console.log('サーバー名: 未固定(サーバー系コマンドでは --servername で指定)');\n }\n console.log(`APIエンドポイント: ${resolveApiBase(brand)}`);\n });\n\n auth\n .command('profiles')\n .description('プロファイル一覧を表示')\n .action((_opts: Record<string, unknown>, cmd: Command) => {\n const format = getFormat(cmd);\n const config = loadConfig(brand);\n const profiles = Object.keys(config.profiles);\n\n if (profiles.length === 0) {\n if (format === 'json') {\n printResult({\n default_profile: config.defaultProfile || null,\n profiles: [],\n message: 'プロファイルが見つかりません',\n }, format);\n } else {\n console.error('プロファイルが見つかりません');\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\n }\n process.exit(1);\n }\n\n const rows = profiles.map((name) => {\n const p = config.profiles[name]!;\n return {\n name,\n default: name === config.defaultProfile,\n api_key: maskApiKey(p.apiKey),\n servername: p.servername ?? null,\n };\n });\n\n if (format === 'json') {\n printResult({\n default_profile: config.defaultProfile || null,\n profiles: rows,\n }, format);\n return;\n }\n\n for (const name of profiles) {\n const marker = name === config.defaultProfile ? ' (default)' : '';\n const p = config.profiles[name]!;\n const key = maskApiKey(p.apiKey);\n const sv = p.servername ? ` servername=${p.servername}` : ' servername=(未固定)';\n console.log(`${name}${marker}: key=${key}${sv}`);\n }\n });\n}\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 { BrandConfig } from 'xnp-shared';\n\nexport function resolveApiBase(brand: BrandConfig): string {\n const envPrefix = brand.brand.toUpperCase();\n return (\n process.env[`${envPrefix}_API_BASE_URL`]\n ?? process.env.XSERVER_API_BASE_URL\n ?? brand.apiBase\n ).replace(/\\/+$/, '');\n}\n","type UnknownRecord = Record<string, unknown>;\r\n\r\nexport type AuthServiceName = 'server' | 'domain' | 'wphosting';\r\n\r\nexport interface AuthServiceInfo {\r\n name: AuthServiceName;\r\n permissionType: string;\r\n targetMode: string;\r\n targets: string[];\r\n allowAcquisition?: boolean;\r\n siteTargetMode?: string;\r\n sites?: string[];\r\n}\r\n\r\nexport interface AuthApiKeyInfo {\r\n expiresAt: string | null;\r\n services: AuthServiceInfo[];\r\n}\r\n\r\nconst SERVICE_ORDER: readonly AuthServiceName[] = ['server', 'domain', 'wphosting'];\r\n\r\nexport const NO_DEFAULT_SERVER = '__XSERVER_NO_DEFAULT_SERVER__';\r\n\r\nexport function servernameChoices(targets: string[]): Array<{ value: string; name: string }> {\r\n return [\r\n ...targets.map((target) => ({ value: target, name: target })),\r\n {\r\n value: NO_DEFAULT_SERVER,\r\n name: '固定しない(コマンド実行時に --servername で指定)',\r\n },\r\n ];\r\n}\r\n\r\nfunction record(value: unknown): UnknownRecord | undefined {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as UnknownRecord) : undefined;\r\n}\r\n\r\nfunction strings(value: unknown): string[] {\r\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string' && item !== '') : [];\r\n}\r\n\r\nfunction stringValue(value: unknown, fallback: string): string {\r\n return typeof value === 'string' && value !== '' ? value : fallback;\r\n}\r\n\r\nexport function parseAuthApiKeyInfo(meData: UnknownRecord): AuthApiKeyInfo {\r\n const rawServices = record(meData.services);\r\n const services: AuthServiceInfo[] = [];\r\n\r\n for (const name of SERVICE_ORDER) {\r\n const block = record(rawServices?.[name]);\r\n if (!block) continue;\r\n\r\n const service: AuthServiceInfo = {\r\n name,\r\n permissionType: stringValue(block.permission_type, 'unknown'),\r\n targetMode: stringValue(block.target_mode, 'unknown'),\r\n targets: strings(block.targets),\r\n };\r\n\r\n if (name === 'domain' && typeof block.allow_acquisition === 'boolean') {\r\n service.allowAcquisition = block.allow_acquisition;\r\n }\r\n if (name === 'wphosting') {\r\n service.siteTargetMode = stringValue(block.site_target_mode, 'unknown');\r\n service.sites = strings(block.sites);\r\n }\r\n\r\n services.push(service);\r\n }\r\n\r\n return {\r\n expiresAt: typeof meData.expires_at === 'string' ? meData.expires_at : null,\r\n services,\r\n };\r\n}\r\n\r\nexport function hasAuthService(info: AuthApiKeyInfo, name: AuthServiceName): boolean {\r\n return info.services.some((service) => service.name === name);\r\n}\r\n\r\nfunction permissionLabel(value: string): string {\r\n if (value === 'full') return 'すべての操作';\r\n if (value === 'read') return '読み取り専用';\r\n if (value === 'custom') return 'カスタム';\r\n return value === 'unknown' ? '不明' : value;\r\n}\r\n\r\nfunction targetLines(service: AuthServiceInfo): string[] {\r\n if (service.name === 'wphosting') {\r\n if (service.targetMode === 'all') return [' 対象契約: すべて'];\r\n return [' 対象契約:', ...service.targets.map((target) => ` - ${target}`)];\r\n }\r\n\r\n const label = service.name === 'server' ? '対象サーバー' : '対象ドメイン';\r\n if (service.targetMode === 'all') {\r\n return [` ${label}: すべて`];\r\n }\r\n\r\n const lines = [` ${label}:`];\r\n lines.push(...service.targets.map((target) => ` - ${target}`));\r\n return lines;\r\n}\r\n\r\nfunction siteTargetLines(service: AuthServiceInfo): string[] {\r\n if (service.name !== 'wphosting') return [];\r\n if (service.siteTargetMode === 'all') return [' 対象サイト: すべて'];\r\n const sites = service.sites ?? [];\r\n return [' 対象サイト:', ...sites.map((site) => ` - ${site}`)];\r\n}\r\n\r\nexport function formatAuthApiKeyInfo(info: AuthApiKeyInfo): string[] {\r\n const lines = ['利用可能なサービス:'];\r\n\r\n if (info.services.length === 0) {\r\n lines.push(' なし');\r\n }\r\n\r\n for (const service of info.services) {\r\n const label = service.name === 'server' ? 'Server' : service.name === 'domain' ? 'Domain' : 'XServer for WordPress';\r\n lines.push(` ${label}`);\r\n lines.push(` 権限: ${permissionLabel(service.permissionType)}`);\r\n lines.push(...targetLines(service));\r\n lines.push(...siteTargetLines(service));\r\n if (service.name === 'domain' && service.allowAcquisition !== undefined) {\r\n lines.push(` 取得・移管・更新: ${service.allowAcquisition ? '許可されています' : '許可されていません'}`);\r\n }\r\n }\r\n\r\n if (info.expiresAt) {\r\n lines.push('', `APIキー有効期限: ${info.expiresAt}`);\r\n }\r\n\r\n return lines;\r\n}\r\n","import { createInterface } from 'node:readline/promises';\nimport { stdin as input, stderr as output } from 'node:process';\nimport type { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport type { BrandConfig } from 'xnp-shared';\nimport { ApiClient, domainLegalNoticeLines } from 'xnp-shared';\nimport { getActiveProfile } from './config.js';\nimport { resolveApiBase } from './api-base.js';\nimport { formatOutput, type OutputFormat } from './output.js';\n\nfunction findRoot(cmd: Command): Command {\n let root = cmd;\n while (root.parent) root = root.parent;\n return root;\n}\n\nexport function resolveClient(cmd: Command, brand: BrandConfig): ApiClient {\n const root = findRoot(cmd);\n const rootOpts = root.opts();\n const profile = getActiveProfile(brand, rootOpts.profile as string);\n if (!profile) {\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\n process.exit(1);\n }\n\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\n const servername = resolveServername(cmd) ?? profile.servername;\n return new ApiClient({\n apiKey: profile.apiKey,\n apiBase: resolveApiBase(brand),\n servername,\n debug,\n });\n}\n\nfunction resolveServername(cmd: Command): string | undefined {\n let current: Command | null = cmd;\n while (current) {\n const val = current.opts()?.servername as string | undefined;\n if (val) return val;\n current = current.parent;\n }\n return undefined;\n}\n\nexport function getFormat(cmd: Command): OutputFormat {\n const root = findRoot(cmd);\n return (root.opts().format as OutputFormat) || 'table';\n}\n\nexport function printResult(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n\n/** Preview / confirmation payloads go to stderr so stdout stays a single machine-readable result. */\nexport function printPreview(data: unknown, format: OutputFormat): void {\n console.error(formatOutput(data, format));\n}\n\nexport async function confirmDestructiveAction(cmd: Command, message: string): Promise<void> {\n const root = findRoot(cmd);\n if (root.opts().yes || process.argv.includes('--yes') || process.argv.includes('-y')) return;\n\n const ok = await confirm({ message, default: false });\n if (!ok) {\n console.error('キャンセルしました');\n process.exit(1);\n }\n}\n\nexport type BillingPurchaseConfirmation = {\n operation: string;\n domain: string;\n totalPrice: number;\n brand: BrandConfig;\n};\n\n/** Exact confirmation phrase required for CLI billing purchases. */\nexport function billingPurchasePhrase(domain: string, totalPrice: number): string {\n return `${domain} を税込${totalPrice}円で承認`;\n}\n\nexport function billingPurchaseMessage(params: BillingPurchaseConfirmation): string {\n const phrase = billingPurchasePhrase(params.domain, params.totalPrice);\n return [\n `課金確認: ${params.operation}`,\n `対象ドメイン: ${params.domain}`,\n `税込合計: ${params.totalPrice}円`,\n ...domainLegalNoticeLines(params.brand),\n '申請後は課金され、原則取り消しできません。',\n `続行する場合は次を正確に入力してください: ${phrase}`,\n '',\n ].join('\\n');\n}\n\n/**\n * Fail-closed billing confirmation for CLI.\n * Requires an interactive TTY and an exact confirmation phrase.\n * --yes / -y never skips this prompt.\n */\nexport async function confirmBillingPurchase(\n params: BillingPurchaseConfirmation,\n): Promise<void> {\n if (!input.isTTY || !output.isTTY) {\n throw new Error(\n '課金を伴う実申請は対話端末(TTY)でのみ実行できます。非対話環境では --dry-run のみ利用してください。',\n );\n }\n\n const phrase = billingPurchasePhrase(params.domain, params.totalPrice);\n output.write(billingPurchaseMessage(params));\n\n const rl = createInterface({ input, output, terminal: true });\n try {\n const answer = (await rl.question('> ')).trim();\n if (answer !== phrase) {\n throw new Error('確認文字列が一致しないため、実申請を中止しました。');\n }\n } finally {\n rl.close();\n }\n}\n\n/**\n * The API releases the key on 4xx but keeps it on 5xx / BACKEND_ERROR, so a same-key\n * resend after a lost response returns 409 DUPLICATE_REQUEST until the 48h TTL expires.\n */\nexport function printIdempotencyKeyNotice(idempotencyKey: string, domain: string): void {\n console.error(`Idempotency-Key: ${idempotencyKey}`);\n console.error('入力不備・残高不足・価格不一致などで却下された場合は、このキーのまま再実行できます。');\n console.error(\n '応答を受け取れなかった場合やサーバーエラーの場合は、同じキーでの再送は48時間 409 DUPLICATE_REQUEST になります。'\n + `domain show ${domain} と請求履歴で状態を確認し、未実行と確認できたときのみ新しいキーで再申請してください。`,\n );\n}\n\nexport function pickDefined(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\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\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 [arrayKey, arrayValue] = arrayEntry;\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayKey);\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 const items = arrayValue as Record<string, unknown>[];\r\n if (items.length === 0) {\r\n // 一覧0件単体は (データなし)。他フィールドと併存する空配列は (0件)\r\n parts.push(scalarEntries.length > 0 ? `${arrayKey} (0件)` : '(データなし)');\r\n } else {\r\n parts.push(renderArrayTable(items));\r\n }\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 collectTableKeys(items: Record<string, unknown>[]): string[] {\r\n const keys: string[] = [];\r\n const seen = new Set<string>();\r\n for (const item of items) {\r\n for (const key of Object.keys(item)) {\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n keys.push(key);\r\n }\r\n }\r\n }\r\n return keys;\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 = collectTableKeys(items);\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","export interface MeServerService {\r\n target_mode: string;\r\n targets?: unknown;\r\n}\r\n\r\nexport type ResolveServernameOutcome =\r\n | { status: 'auto'; servername: string }\r\n | { status: 'choose'; targets: string[] }\r\n | { status: 'manual'; reason: 'all' | 'no_server' | 'empty_targets' };\r\n\r\n/**\r\n * /v1/me の services.server から auth login 用の servername を解決する。\r\n * レガシー3フィールド(servername 等)は参照しない。\r\n */\r\nexport function resolveServernameFromMe(meData: Record<string, unknown>): ResolveServernameOutcome {\r\n const services = meData.services as Record<string, MeServerService> | undefined;\r\n const server = services?.server;\r\n\r\n if (!server) {\r\n return { status: 'manual', reason: 'no_server' };\r\n }\r\n\r\n const targetMode = server.target_mode;\r\n const targets = normalizeTargets(server.targets);\r\n\r\n if (targetMode === 'all') {\r\n return { status: 'manual', reason: 'all' };\r\n }\r\n\r\n if (targetMode === 'selected') {\r\n if (targets.length === 1) {\r\n return { status: 'auto', servername: targets[0]! };\r\n }\r\n if (targets.length >= 2) {\r\n return { status: 'choose', targets };\r\n }\r\n return { status: 'manual', reason: 'empty_targets' };\r\n }\r\n\r\n return { status: 'manual', reason: 'empty_targets' };\r\n}\r\n\r\nexport function manualServernameMessage(\r\n reason: Extract<ResolveServernameOutcome, { status: 'manual' }>['reason'],\r\n): string {\r\n switch (reason) {\r\n case 'no_server':\r\n return 'このAPIキーではサーバーAPIを利用できません(サーバー区分が含まれていません)。';\r\n case 'all':\r\n return 'このAPIキーは対象サーバーが固定されていません(「すべてのサーバー」等)。';\r\n case 'empty_targets':\r\n return 'このAPIキーのサーバー対象を特定できません。';\r\n }\r\n}\r\n\r\nfunction normalizeTargets(targets: unknown): string[] {\r\n if (!Array.isArray(targets)) {\r\n return [];\r\n }\r\n return targets.filter((t): t is string => typeof t === 'string' && t !== '');\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 { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerResourceMonitorCommands(parent: Command, brand: BrandConfig): void {\r\n const resourceMonitor = parent\r\n .command('resource-monitor')\r\n .description('リソースモニター');\r\n\r\n resourceMonitor\r\n .command('get')\r\n .description('指定日のCPU・メモリ・転送量時系列を取得')\r\n .requiredOption('--date <date>', '対象日(Y-m-d または Ymd。当日含む直近1か月)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getResourceMonitor(opts.date), 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 registerWafCommands(parent: Command, brand: BrandConfig): void {\r\n const waf = parent\r\n .command('waf')\r\n .description('WAF設定');\r\n\r\n waf\r\n .command('list')\r\n .description('WAF設定一覧を取得')\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.listWaf(params), getFormat(parent));\r\n });\r\n\r\n waf\r\n .command('update <domain>')\r\n .description('WAF設定を更新(指定した項目のみ)')\r\n .option('--xss-protection <value>', 'XSS対策(true/false または 1/0)')\r\n .option('--sql-injection-protection <value>', 'SQL対策(true/false または 1/0)')\r\n .option('--file-protection <value>', 'ファイル対策(true/false または 1/0)')\r\n .option('--mail-protection <value>', 'メール対策(true/false または 1/0)')\r\n .option('--command-protection <value>', 'コマンド対策(true/false または 1/0)')\r\n .option('--php-protection <value>', 'PHP対策(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.xssProtection !== undefined) data.xss_protection = opts.xssProtection;\r\n if (opts.sqlInjectionProtection !== undefined) data.sql_injection_protection = opts.sqlInjectionProtection;\r\n if (opts.fileProtection !== undefined) data.file_protection = opts.fileProtection;\r\n if (opts.mailProtection !== undefined) data.mail_protection = opts.mailProtection;\r\n if (opts.commandProtection !== undefined) data.command_protection = opts.commandProtection;\r\n if (opts.phpProtection !== undefined) data.php_protection = opts.phpProtection;\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.updateWaf(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, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\n/** CLI kebab-case オプション名 → API ボディキー */\r\nconst PHP_INI_UPDATE_OPTIONS: { cli: string; api: string; desc: string }[] = [\r\n { cli: 'display-errors', api: 'display_errors', desc: 'エラー内容を画面に出力(On / Off)' },\r\n { cli: 'error-reporting', api: 'error_reporting', desc: 'エラー出力レベル' },\r\n { cli: 'display-startup-errors', api: 'display_startup_errors', desc: '起動時エラーを表示(On / Off)' },\r\n { cli: 'session-auto-start', api: 'session.auto_start', desc: 'セッション自動開始(0 / 1)' },\r\n { cli: 'session-name', api: 'session.name', desc: 'セッション名' },\r\n { cli: 'session-use-cookies', api: 'session.use_cookies', desc: 'セッションIDにクッキーを使用(0 / 1)' },\r\n { cli: 'session-use-only-cookies', api: 'session.use_only_cookies', desc: 'クッキーのみでセッションIDを保存(0 / 1)' },\r\n { cli: 'session-use-trans-sid', api: 'session.use_trans_sid', desc: 'URLへセッションIDを自動設定(0 / 1)' },\r\n { cli: 'session-cookie-lifetime', api: 'session.cookie_lifetime', desc: 'クッキー有効期間(秒)' },\r\n { cli: 'session-cookie-path', api: 'session.cookie_path', desc: 'クッキーを有効とするパス' },\r\n { cli: 'session-cookie-domain', api: 'session.cookie_domain', desc: 'クッキーを有効とするドメイン' },\r\n { cli: 'mbstring-language', api: 'mbstring.language', desc: 'デフォルト言語' },\r\n { cli: 'mbstring-internal-encoding', api: 'mbstring.internal_encoding', desc: '内部文字エンコーディング' },\r\n { cli: 'mbstring-http-input', api: 'mbstring.http_input', desc: 'HTTP入力文字エンコーディング変換' },\r\n { cli: 'mbstring-http-output', api: 'mbstring.http_output', desc: 'HTTP出力文字エンコーディング変換' },\r\n { cli: 'mbstring-encoding-translation', api: 'mbstring.encoding_translation', desc: '内部エンコーディングへの変換(On / Off)' },\r\n { cli: 'mbstring-detect-order', api: 'mbstring.detect_order', desc: '文字コード検出' },\r\n { cli: 'mbstring-substitute-character', api: 'mbstring.substitute_character', desc: '無効文字の代替文字' },\r\n { cli: 'max-execution-time', api: 'max_execution_time', desc: '最大実行時間(秒)' },\r\n { cli: 'max-input-time', api: 'max_input_time', desc: '入力パース最大時間(秒)' },\r\n { cli: 'memory-limit', api: 'memory_limit', desc: '最大メモリ' },\r\n { cli: 'post-max-size', api: 'post_max_size', desc: 'POSTデータ最大サイズ' },\r\n { cli: 'upload-max-filesize', api: 'upload_max_filesize', desc: 'アップロードファイル最大サイズ' },\r\n { cli: 'register-globals', api: 'register_globals', desc: 'register_globals(On / Off)' },\r\n { cli: 'magic-quotes-gpc', api: 'magic_quotes_gpc', desc: 'magic_quotes_gpc(On / Off)' },\r\n { cli: 'safe-mode', api: 'safe_mode', desc: 'safe_mode(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'file-uploads', api: 'file_uploads', desc: 'HTTPファイルアップロード(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-fopen', api: 'allow_url_fopen', desc: 'allow_url_fopen(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-include', api: 'allow_url_include', desc: 'allow_url_include(On / Off。user_ini_active が true のときは変更不可)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api } of PHP_INI_UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = value;\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerPhpIniCommands(parent: Command, brand: BrandConfig): void {\r\n const phpIni = parent\r\n .command('php-ini')\r\n .description('php.ini設定(php-version とは別)');\r\n\r\n phpIni\r\n .command('list')\r\n .description('php.ini設定を取得')\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.listPhpIni(params), getFormat(parent));\r\n });\r\n\r\n const update = phpIni\r\n .command('update <domain>')\r\n .description('php.ini設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of PHP_INI_UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpIni(domain, data), getFormat(parent));\r\n });\r\n\r\n phpIni\r\n .command('reset <domain>')\r\n .description('php.ini設定を初期値に戻す')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" の php.ini を初期値に戻します。この操作は取り消しできません。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetPhpIni(domain), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_BLOCKS = [\r\n 'comment_restriction',\r\n 'login_attempt_limit',\r\n 'foreign_ip_restriction',\r\n 'ip_restriction',\r\n] as const;\r\n\r\nconst UPDATE_OPTIONS: { cli: string; desc: string }[] = [\r\n { cli: 'comment-restriction-bulk-post-enabled', desc: '単一ユーザーからの大量投稿(true/false または 1/0)' },\r\n { cli: 'comment-restriction-foreign-post-enabled', desc: '国外からの投稿(true/false または 1/0)' },\r\n { cli: 'login-attempt-limit-enabled', desc: 'ログイン試行回数制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-enabled', desc: 'ダッシュボード アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-allowed-ips', desc: 'ダッシュボード アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-xml-rpc-api-enabled', desc: 'XML-RPC API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-xml-rpc-api-allowed-ips', desc: 'XML-RPC API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-rest-api-enabled', desc: 'REST API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-rest-api-allowed-ips', desc: 'REST API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-wlwmanifest-enabled', desc: 'wlwmanifest.xml アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-wlwmanifest-allowed-ips', desc: 'wlwmanifest.xml アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'ip-restriction-enabled', desc: 'IPアドレス制限(ダッシュボード)(true/false または 1/0)' },\r\n { cli: 'ip-restriction-allowed-ips', desc: 'IPアドレス制限のホワイトリスト(カンマ区切り IPv4 または CIDR。通常はクォート不要。空にする場合のみ \"\")' },\r\n];\r\n\r\nfunction parseIpAddressList(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\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction setForeignIpTarget(\r\n block: Record<string, unknown>,\r\n target: string,\r\n enabledLabel: string,\r\n enabled: string | undefined,\r\n allowedIps: string | undefined,\r\n): void {\r\n const entry: Record<string, unknown> = {};\r\n if (enabled !== undefined) entry.enabled = parseBooleanParam(enabledLabel, enabled);\r\n if (allowedIps !== undefined) entry.allowed_ip_addresses = parseIpAddressList(allowedIps);\r\n if (Object.keys(entry).length > 0) block[target] = entry;\r\n}\r\n\r\nfunction buildUpdateData(domain: string, opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = { domain };\r\n\r\n const commentRestriction: Record<string, unknown> = {};\r\n if (opts.commentRestrictionBulkPostEnabled !== undefined) {\r\n commentRestriction.bulk_post = {\r\n enabled: parseBooleanParam('単一ユーザーからの大量投稿', opts.commentRestrictionBulkPostEnabled as string),\r\n };\r\n }\r\n if (opts.commentRestrictionForeignPostEnabled !== undefined) {\r\n commentRestriction.foreign_post = {\r\n enabled: parseBooleanParam('国外からの投稿', opts.commentRestrictionForeignPostEnabled as string),\r\n };\r\n }\r\n if (Object.keys(commentRestriction).length > 0) {\r\n data.comment_restriction = commentRestriction;\r\n }\r\n\r\n if (opts.loginAttemptLimitEnabled !== undefined) {\r\n data.login_attempt_limit = {\r\n enabled: parseBooleanParam('ログイン試行回数制限', opts.loginAttemptLimitEnabled as string),\r\n };\r\n }\r\n\r\n const foreignIpRestriction: Record<string, unknown> = {};\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'dashboard',\r\n 'ダッシュボード アクセス制限',\r\n opts.foreignIpDashboardEnabled as string | undefined,\r\n opts.foreignIpDashboardAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'xml_rpc_api',\r\n 'XML-RPC API アクセス制限',\r\n opts.foreignIpXmlRpcApiEnabled as string | undefined,\r\n opts.foreignIpXmlRpcApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'rest_api',\r\n 'REST API アクセス制限',\r\n opts.foreignIpRestApiEnabled as string | undefined,\r\n opts.foreignIpRestApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'wlwmanifest',\r\n 'wlwmanifest.xml アクセス制限',\r\n opts.foreignIpWlwmanifestEnabled as string | undefined,\r\n opts.foreignIpWlwmanifestAllowedIps as string | undefined,\r\n );\r\n if (Object.keys(foreignIpRestriction).length > 0) {\r\n data.foreign_ip_restriction = foreignIpRestriction;\r\n }\r\n\r\n const ipRestriction: Record<string, unknown> = {};\r\n if (opts.ipRestrictionEnabled !== undefined) {\r\n ipRestriction.enabled = parseBooleanParam('IPアドレス制限(ダッシュボード)', opts.ipRestrictionEnabled as string);\r\n }\r\n if (opts.ipRestrictionAllowedIps !== undefined) {\r\n ipRestriction.allowed_ip_addresses = parseIpAddressList(opts.ipRestrictionAllowedIps as string);\r\n }\r\n if (Object.keys(ipRestriction).length > 0) {\r\n data.ip_restriction = ipRestriction;\r\n }\r\n\r\n if (!UPDATE_BLOCKS.some((key) => key in data)) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n return data;\r\n}\r\n\r\nexport function registerWordPressSecurityCommands(parent: Command, brand: BrandConfig): void {\r\n const wordpressSecurity = parent\r\n .command('wordpress-security')\r\n .description('WordPressセキュリティ設定');\r\n\r\n wordpressSecurity\r\n .command('get')\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.getWordPressSecurity(params), getFormat(parent));\r\n });\r\n\r\n const update = wordpressSecurity\r\n .command('update <domain>')\r\n .description('WordPressセキュリティ設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(domain, opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordPressSecurity(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\nexport function registerXAcceleratorCommands(parent: Command, brand: BrandConfig): void {\r\n const xAccelerator = parent\r\n .command('x-accelerator')\r\n .description('Xアクセラレータ設定');\r\n\r\n xAccelerator\r\n .command('list')\r\n .description('Xアクセラレータ設定一覧を取得')\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.listXAccelerator(params), getFormat(parent));\r\n });\r\n\r\n xAccelerator\r\n .command('update <domain>')\r\n .description('Xアクセラレータ設定を変更')\r\n .requiredOption('--xaccelerator-status <status>', 'Xアクセラレータ設定(off / v1 / v2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateXAccelerator(domain, { xaccelerator_status: opts.xacceleratorStatus }),\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 registerServerCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const serverCache = parent\r\n .command('server-cache')\r\n .description('サーバーキャッシュ設定');\r\n\r\n serverCache\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.listServerCache(params), getFormat(parent));\r\n });\r\n\r\n serverCache\r\n .command('update <domain>')\r\n .description('サーバーキャッシュ設定を変更')\r\n .requiredOption('--server-cache-status <status>', 'サーバーキャッシュ設定(on / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateServerCache(domain, { server_cache_status: opts.serverCacheStatus }),\r\n getFormat(parent),\r\n );\r\n });\r\n\r\n serverCache\r\n .command('clear-cache <domain>')\r\n .description('サーバーキャッシュの内容を削除(パージ)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" のサーバーキャッシュ内容を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.clearServerCache(domain), 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 registerBrowserCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const browserCache = parent\r\n .command('browser-cache')\r\n .description('ブラウザキャッシュ設定');\r\n\r\n browserCache\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.listBrowserCache(params), getFormat(parent));\r\n });\r\n\r\n browserCache\r\n .command('update <domain>')\r\n .description('ブラウザキャッシュ設定を変更')\r\n .requiredOption('--browser-cache-status <status>', 'ブラウザキャッシュ設定(all / ignore-css-js / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateBrowserCache(domain, { browser_cache_status: opts.browserCacheStatus }),\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 registerUrlRedirectCommands(parent: Command, brand: BrandConfig): void {\r\n const urlRedirect = parent\r\n .command('url-redirect')\r\n .description('サイト転送設定');\r\n\r\n urlRedirect\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.listUrlRedirect(params), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('add')\r\n .description('サイト転送設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--from-host <host>', '転送元ホスト(FQDN)')\r\n .option('--from-path <path>', '転送元パス(省略時は /。先頭が / でない場合は API 側で / を付与)')\r\n .requiredOption('--redirect-to-url <url>', '転送先URL(http または https)')\r\n .requiredOption('--status-code <code>', '転送時のステータスコード(301 / 302)')\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 from_host: opts.fromHost,\r\n redirect_to_url: opts.redirectToUrl,\r\n status_code: Number(opts.statusCode),\r\n };\r\n if (opts.fromPath !== undefined) data.from_path = opts.fromPath;\r\n printResult(await client.addUrlRedirect(data), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('delete <redirectId>')\r\n .description('サイト転送設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (redirectId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `サイト転送設定 \"${redirectId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteUrlRedirect(redirectId), 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 registerAccessDenyCommands(parent: Command, brand: BrandConfig): void {\r\n const accessDeny = parent\r\n .command('access-deny')\r\n .description('アクセス拒否設定');\r\n\r\n accessDeny\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.listAccessDeny(params), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('add')\r\n .description('アクセス拒否設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--ip-address <address>', '拒否IPアドレス・ホスト(IPv4 / CIDR / 部分IP / ホスト名)')\r\n .option('--memo <memo>', 'メモ(最大500文字)')\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 ip_address: opts.ipAddress,\r\n };\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addAccessDeny(data), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('update <denyId>')\r\n .description('アクセス拒否設定のメモを更新')\r\n .option('--memo <memo>', 'メモ(省略または空文字でクリア)')\r\n .action(async (denyId: string, opts) => {\r\n if (opts.memo === undefined) {\r\n throw new Error('--memo を指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAccessDeny(denyId, { memo: opts.memo }), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('delete <denyId>')\r\n .description('アクセス拒否設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (denyId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `アクセス拒否設定 \"${denyId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteAccessDeny(denyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_OPTIONS: { cli: string; api: string; label: string; desc: string }[] = [\r\n { cli: 'xoptimize-images', api: 'xoptimize_images', label: '画像最適化', desc: '画像最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-images', api: 'lazyload_images', label: '画像遅延読み込み', desc: '画像遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-css', api: 'xoptimize_css', label: 'CSS最適化', desc: 'CSS最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-css', api: 'lazyload_css', label: 'CSS遅延読み込み', desc: 'CSS遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-javascript', api: 'xoptimize_javascript', label: 'JavaScript最適化', desc: 'JavaScript最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-javascript', api: 'lazyload_javascript', label: 'JavaScript遅延読み込み', desc: 'JavaScript遅延読み込み(true/false または 1/0)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api, label } of UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = parseBooleanParam(label, value as string);\r\n }\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n if (Object.keys(data).length > 1) {\r\n throw new Error('1リクエストで変更できるのは1つの最適化機能のみです');\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerXPageSpeedCommands(parent: Command, brand: BrandConfig): void {\r\n const xPageSpeed = parent\r\n .command('xpagespeed')\r\n .description('XPageSpeed設定');\r\n\r\n xPageSpeed\r\n .command('list')\r\n .description('XPageSpeed設定一覧を取得')\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.listXPageSpeed(params), getFormat(parent));\r\n });\r\n\r\n const update = xPageSpeed\r\n .command('update <domain>')\r\n .description('XPageSpeedの最適化機能を変更(1リクエストで1機能のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateXPageSpeed(domain, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nconst DOMAIN_ELEMENT_TYPES = ['web', 'setting', 'mail'] as const;\r\n\r\nfunction validationError(...errors: string[]): never {\r\n throw new ApiError('入力値が正しくありません', 422, 'VALIDATION_ERROR', errors);\r\n}\r\n\r\n\r\nfunction collectFlagValue(value: string, previous: string[]): string[] {\r\n\r\n return previous.concat([value]);\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElementEntry(part: string): { domain: string; elements: string[] } {\r\n\r\n const equalIndex = part.indexOf('=');\r\n\r\n if (equalIndex === -1) {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const domain = part.slice(0, equalIndex).trim();\r\n\r\n const elementsRaw = part.slice(equalIndex + 1).trim();\r\n\r\n if (domain === '' || elementsRaw === '') {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const elements = elementsRaw.split(',').map((e) => e.trim()).filter((e) => e !== '');\r\n\r\n if (elements.length === 0) {\r\n\r\n validationError(`domain_elements の ${domain} に elements(${DOMAIN_ELEMENT_TYPES.join(', ')})を1件以上指定してください`);\r\n\r\n }\r\n\r\n\r\n\r\n return { domain, elements };\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElements(values: string[]): Array<{ domain: string; elements: string[] }> {\r\n\r\n if (values.length === 0) {\r\n\r\n validationError('scope が selected の場合、domain_elements を1件以上指定してください');\r\n\r\n }\r\n\r\n\r\n\r\n return values.map((value) => parseDomainElementEntry(value.trim()));\r\n\r\n}\r\n\r\n\r\n\r\nexport function registerAutoBackupCommands(parent: Command, brand: BrandConfig): void {\r\n\r\n const autoBackup = parent\r\n\r\n .command('auto-backup')\r\n\r\n .description('自動バックアップの取得・復元');\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('backup-dates')\r\n\r\n .description('選択可能なバックアップ日一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackupBackupDates(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('list')\r\n\r\n .description('自動バックアップ申込履歴一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackup(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('show <requestId>')\r\n\r\n .description('自動バックアップ申込履歴の詳細を取得')\r\n\r\n .action(async (requestId: string) => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.getAutoBackup(requestId), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('create')\r\n\r\n .description('自動バックアップの取得または復元を申し込む')\r\n\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n\r\n .requiredOption('--scope <scope>', '処理方法(all / selected)')\r\n\r\n .option(\r\n\r\n '--domain-elements <value>',\r\n\r\n '対象ドメイン・ディレクトリ(scope=selected のとき必須。繰り返し可)。形式: example.com=web,setting(elements: web / setting / mail)',\r\n\r\n collectFlagValue,\r\n\r\n [],\r\n\r\n )\r\n\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n\r\n .action(async (opts) => {\r\n\r\n const operationType = opts.operationType as string;\r\n\r\n const scope = opts.scope as string;\r\n\r\n\r\n\r\n if (operationType === 'restore') {\r\n\r\n await confirmDestructiveAction(\r\n\r\n parent,\r\n\r\n '自動バックアップの復元を申し込みます。サーバー上のデータが上書きされ、取り消しできません。よろしいですか?',\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const data: Record<string, unknown> = {\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\r\n scope,\r\n };\r\n\r\n const domainElementValues = opts.domainElements as string[];\r\n\r\n if (scope === 'selected') {\r\n if (domainElementValues.length === 0) {\r\n validationError('scope が selected の場合、--domain-elements を指定してください');\r\n }\r\n data.domain_elements = parseDomainElements(domainElementValues);\r\n } else if (domainElementValues.length > 0) {\r\n validationError('対象ドメイン・ディレクトリは 処理方法 が selected の場合のみ指定できます。');\r\n }\r\n\r\n\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.createAutoBackup(data), getFormat(parent));\r\n\r\n });\r\n\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 registerMysqlBackupCommands(parent: Command, brand: BrandConfig): void {\r\n const mysqlBackup = parent\r\n .command('mysql-backup')\r\n .description('MySQLバックアップの取得・復元');\r\n\r\n mysqlBackup\r\n .command('databases')\r\n .description('MySQLバックアップの状態を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackupDatabases(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('list')\r\n .description('MySQLバックアップ申込履歴一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackup(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('show <requestId>')\r\n .description('MySQLバックアップ申込履歴詳細を取得')\r\n .action(async (requestId: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMysqlBackup(requestId), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('create')\r\n .description('MySQLバックアップの取得または復元を申し込む')\r\n .requiredOption('--db-name <name>', 'データベース名')\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n .action(async (opts) => {\r\n const operationType = opts.operationType as string;\r\n\r\n if (operationType === 'restore') {\r\n await confirmDestructiveAction(\r\n parent,\r\n `データベース \"${opts.dbName}\" の MySQLバックアップ復元を申し込みます。対象 DB が上書きされ、取り消しできません。よろしいですか?`,\r\r\n );\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.createMysqlBackup({\r\n db_name: opts.dbName,\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\r\n }),\r\n getFormat(parent),\r\n );\r\n });\r\n}\r\n","import type { Command } from 'commander';\nimport type { BrandConfig } from 'xnp-shared';\nimport { ApiClient } from 'xnp-shared';\nimport { resolveApiBase } from '../../lib/api-base.js';\nimport { getActiveProfile } from '../../lib/config.js';\nimport { getFormat, printResult } from '../../lib/command-helper.js';\n\nexport function registerMeCommand(program: Command, brand: BrandConfig): void {\n program\n .command('me')\n .description('現在のAPIキー情報を表示')\n .action(async (_opts: Record<string, unknown>, cmd: Command) => {\n const root = cmd.parent!;\n const rootOpts = root.opts();\n const profile = getActiveProfile(brand, rootOpts.profile as string);\n if (!profile) {\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\n process.exit(1);\n }\n\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\n const client = new ApiClient({\n apiKey: profile.apiKey,\n apiBase: resolveApiBase(brand),\n servername: profile.servername,\n debug,\n });\n printResult(await client.getMe(), getFormat(cmd));\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Command } from 'commander';\nimport type { BrandConfig } from 'xnp-shared';\nimport { domainLegalNoticeLines, withDomainAcquisitionPermissionDiagnosis } from 'xnp-shared';\nimport {\n confirmBillingPurchase,\n confirmDestructiveAction,\n getFormat,\n pickDefined,\n printIdempotencyKeyNotice,\n printPreview,\n printResult,\n resolveClient,\n} from '../../lib/command-helper.js';\nimport {\n parseInteger,\n parseNameservers,\n parseRegistrationNameservers,\n parseStrictBoolean,\n parseWhoisData,\n requireAtLeastOneField,\n validateDate,\n validateDnsContent,\n validateDnsHost,\n validateDnsId,\n validateDnsType,\n validateIdempotencyKey,\n} from '../../lib/domain-validation.js';\n\ninterface PurchaseOptions {\n expectedTotalPrice: string;\n agreeToTerms?: boolean;\n confirmPurchase?: boolean;\n dryRun?: boolean;\n idempotencyKey?: string;\n}\n\nfunction dnsData(opts: Record<string, string | undefined>): Record<string, unknown> {\n return pickDefined({\n host: opts.host === undefined ? undefined : validateDnsHost(opts.host),\n type: opts.type === undefined ? undefined : validateDnsType(opts.type),\n content: opts.content === undefined ? undefined : validateDnsContent(opts.content),\n ttl: opts.ttl === undefined ? undefined : parseInteger(opts.ttl, '--ttl', 60, 86400),\n priority: opts.priority === undefined ? undefined : parseInteger(opts.priority, '--priority', 0, 999),\n });\n}\n\nfunction addPurchaseOptions(command: Command): Command {\n return command\n .requiredOption('--expected-total-price <yen>', '事前確認した税込合計金額(0以上の整数)')\n .option('--confirm-purchase', '課金を伴う申請を明示的に確認')\n .option('--dry-run', 'プレビューのみ実行')\n .option('--idempotency-key <key>', '実申請の冪等性キー(英数字・_・-の8~64文字)');\n}\n\nfunction purchaseValues(opts: PurchaseOptions): { expectedTotalPrice: number; idempotencyKey: string } {\n const expectedTotalPrice = parseInteger(opts.expectedTotalPrice, '--expected-total-price', 0);\n const idempotencyKey = validateIdempotencyKey(opts.idempotencyKey ?? randomUUID());\n return { expectedTotalPrice, idempotencyKey };\n}\n\nfunction requirePurchaseConfirmation(opts: PurchaseOptions): void {\n if (!opts.confirmPurchase) {\n throw new Error('実申請には --confirm-purchase が必要です(--yes では省略できません)。続けてTTYで確認文字列の入力も必要です');\n }\n}\n\nfunction requireTermsAgreement(opts: PurchaseOptions): void {\n if (!opts.agreeToTerms) {\n throw new Error(\n '新規取得・移管には --agree-to-terms による「サービス利用規約」および'\n + '「個人情報の取り扱いについて」への明示同意が必要です',\n );\n }\n}\n\nfunction printPurchaseWarning(\n operation: string,\n domain: string,\n totalPrice: number,\n brand: BrandConfig,\n): void {\n console.error([\n `課金操作: ${operation}`,\n `対象ドメイン: ${domain}`,\n `税込合計金額: ${totalPrice}円`,\n ...domainLegalNoticeLines(brand),\n '実申請後は原則取り消せません。',\n ].join('\\n'));\n}\n\nfunction totalPriceFromPreview(preview: unknown, expectedTotalPrice: number): number {\n const totalPrice = Number((preview as { total_price?: unknown } | null)?.total_price);\n if (!Number.isFinite(totalPrice)) {\n throw new Error('dry-run結果から合計金額を取得できませんでした。');\n }\n if (totalPrice !== expectedTotalPrice) {\n throw new Error(\n `価格不一致のため実申請を中止しました(見積 ${totalPrice}円 / 指定 ${expectedTotalPrice}円)。`,\n );\n }\n return totalPrice;\n}\n\nexport function registerDomainCommands(parent: Command, brand: BrandConfig): void {\n parent\n .command('list')\n .description('保有ドメインの一覧を取得')\n .action(async () => {\n const client = resolveClient(parent, brand);\n printResult(await client.listDomains(), getFormat(parent));\n });\n\n parent\n .command('show <domain>')\n .description('保有ドメインの詳細を取得')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(await client.getDomainDetail(domain), getFormat(parent));\n });\n\n const nameservers = parent.command('nameservers').description('レジストラ側ネームサーバー設定');\n nameservers\n .command('show <domain>')\n .description('ネームサーバーを取得')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(await client.getDomainNameservers(domain), getFormat(parent));\n });\n nameservers\n .command('update <domain>')\n .description('ネームサーバーを全置換')\n .requiredOption('--nameservers <list>', 'ネームサーバー(1~13件、カンマ区切り)')\n .action(async (domain: string, opts) => {\n const client = resolveClient(parent, brand);\n printResult(\n await client.updateDomainNameservers(domain, { nameservers: parseNameservers(String(opts.nameservers)) }),\n getFormat(parent),\n );\n });\n\n const whois = parent.command('whois').description('Whois情報設定');\n whois\n .command('show <domain>')\n .description('Whois情報を取得')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(await client.getDomainWhois(domain), getFormat(parent));\n });\n whois\n .command('update <domain>')\n .description('Whois情報を更新')\n .requiredOption('--data <json>', 'whois_privacy または fields を含むJSONオブジェクト')\n .action(async (domain: string, opts) => {\n const client = resolveClient(parent, brand);\n printResult(\n await client.updateDomainWhois(domain, parseWhoisData(String(opts.data))),\n getFormat(parent),\n );\n });\n\n const registrarLock = parent.command('registrar-lock').description('レジストラロック設定');\n registrarLock\n .command('show <domain>')\n .description('レジストラロックの状態を取得')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(await client.getDomainRegistrarLock(domain), getFormat(parent));\n });\n registrarLock\n .command('update <domain>')\n .description('レジストラロックを変更')\n .requiredOption('--locked <bool>', 'ロック状態(true / false)')\n .action(async (domain: string, opts) => {\n const client = resolveClient(parent, brand);\n printResult(\n await client.updateDomainRegistrarLock(domain, {\n locked: parseStrictBoolean(String(opts.locked), '--locked'),\n }),\n getFormat(parent),\n );\n });\n\n const dns = parent.command('dns').description('レジストラ側DNSレコード設定');\n dns\n .command('list <domain>')\n .description('DNSレコード一覧を取得')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(await client.listDomainDns(domain), getFormat(parent));\n });\n dns\n .command('add <domain>')\n .description('DNSレコードを追加')\n .requiredOption('--host <host>', 'ホスト名(@でapex)')\n .requiredOption('--type <type>', 'A / AAAA / CNAME / MX / TXT / NS / SRV')\n .requiredOption('--content <content>', 'レコード値')\n .option('--ttl <ttl>', 'TTL(60~86400)')\n .option('--priority <priority>', '優先度(0~999)')\n .action(async (domain: string, opts) => {\n const client = resolveClient(parent, brand);\n printResult(await client.addDomainDns(domain, dnsData(opts)), getFormat(parent));\n });\n dns\n .command('update <domain> <dns_id>')\n .description('DNSレコードを部分更新')\n .option('--host <host>', 'ホスト名')\n .option('--type <type>', 'A / AAAA / CNAME / MX / TXT / NS / SRV')\n .option('--content <content>', 'レコード値')\n .option('--ttl <ttl>', 'TTL(60~86400)')\n .option('--priority <priority>', '優先度(0~999)')\n .action(async (domain: string, dnsId: string, opts) => {\n const data = dnsData(opts);\n requireAtLeastOneField(data, 'DNS更新項目を1つ以上指定してください');\n const client = resolveClient(parent, brand);\n printResult(\n await client.updateDomainDns(domain, validateDnsId(dnsId), data),\n getFormat(parent),\n );\n });\n dns\n .command('delete <domain> <dns_id>')\n .description('DNSレコードを削除')\n .action(async (domain: string, dnsId: string) => {\n const validatedDnsId = validateDnsId(dnsId);\n const client = resolveClient(parent, brand);\n const response = await client.listDomainDns(domain);\n const records = (\n typeof response === 'object'\n && response !== null\n && Array.isArray((response as { records?: unknown }).records)\n )\n ? (response as { records: Array<Record<string, unknown>> }).records\n : [];\n const target = records.find((record) => String(record.id) === validatedDnsId);\n if (!target) {\n throw new Error(`DNSレコード ${validatedDnsId} を一覧から確認できませんでした`);\n }\n printPreview(target, getFormat(parent));\n await confirmDestructiveAction(\n parent,\n `ドメイン \"${domain}\" のDNSレコード \"${validatedDnsId}\" を削除します。元に戻せません。よろしいですか?`,\n );\n printResult(await client.deleteDomainDns(domain, validatedDnsId), getFormat(parent));\n });\n\n parent\n .command('check <domain>')\n .description('ドメインの取得可否と見積を確認')\n .action(async (domain: string) => {\n const client = resolveClient(parent, brand);\n printResult(\n await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.checkDomain(domain),\n ),\n getFormat(parent),\n );\n });\n\n parent\n .command('pricing')\n .description('TLD別の価格一覧を取得')\n .option('--tld <list>', 'TLD(カンマ区切り)')\n .action(async (opts) => {\n const client = resolveClient(parent, brand);\n const params = opts.tld === undefined ? undefined : { tld: String(opts.tld) };\n printResult(\n await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.getDomainPricing(params),\n ),\n getFormat(parent),\n );\n });\n\n addPurchaseOptions(\n parent\n .command('register <domain>')\n .description('ドメインを新規取得')\n .requiredOption('--years <n>', '契約年数(1~5)')\n .option(\n '--agree-to-terms',\n 'ドメイン取得の「サービス利用規約」および「個人情報の取り扱いについて」に同意',\n )\n .option('--nameservers <list>', '取得時に設定するネームサーバー(1~6件、カンマ区切り)'),\n ).action(async (\n domain: string,\n opts: PurchaseOptions & { years: string; nameservers?: string },\n ) => {\n requireTermsAgreement(opts);\n const { expectedTotalPrice, idempotencyKey } = purchaseValues(opts);\n const client = resolveClient(parent, brand);\n const baseData = {\n domain_name: domain,\n years: parseInteger(opts.years, '--years', 1, 5),\n expected_total_price: expectedTotalPrice,\n agree_to_terms: true,\n ...(opts.nameservers === undefined\n ? {}\n : { nameservers: parseRegistrationNameservers(opts.nameservers) }),\n };\n const preview = await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.registerDomain({ ...baseData, dry_run: true }),\n );\n if (opts.dryRun) {\n printResult(preview, getFormat(parent));\n return;\n }\n printPreview(preview, getFormat(parent));\n const totalPrice = totalPriceFromPreview(preview, expectedTotalPrice);\n printPurchaseWarning('ドメイン新規取得', domain, totalPrice, brand);\n requirePurchaseConfirmation(opts);\n await confirmBillingPurchase({\n operation: 'ドメイン新規取得',\n domain,\n totalPrice,\n brand,\n });\n printIdempotencyKeyNotice(idempotencyKey, domain);\n printResult(\n await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.registerDomain({ ...baseData, dry_run: false }, idempotencyKey),\n ),\n getFormat(parent),\n );\n });\n\n addPurchaseOptions(\n parent\n .command('transfer <domain>')\n .description('ドメイン移管を申請')\n .option(\n '--agree-to-terms',\n 'ドメイン移管の「サービス利用規約」および「個人情報の取り扱いについて」に同意',\n )\n .requiredOption('--auth-code <code>', '移管元で取得したAuthCode'),\n ).action(async (domain: string, opts: PurchaseOptions & { authCode: string }) => {\n requireTermsAgreement(opts);\n const { expectedTotalPrice, idempotencyKey } = purchaseValues(opts);\n const client = resolveClient(parent, brand);\n const baseData = {\n auth_code: opts.authCode,\n expected_total_price: expectedTotalPrice,\n agree_to_terms: true,\n };\n const preview = await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.transferDomain(domain, { ...baseData, dry_run: true }),\n );\n if (opts.dryRun) {\n printResult(preview, getFormat(parent));\n return;\n }\n printPreview(preview, getFormat(parent));\n const totalPrice = totalPriceFromPreview(preview, expectedTotalPrice);\n printPurchaseWarning('ドメイン移管', domain, totalPrice, brand);\n requirePurchaseConfirmation(opts);\n await confirmBillingPurchase({\n operation: 'ドメイン移管',\n domain,\n totalPrice,\n brand,\n });\n printIdempotencyKeyNotice(idempotencyKey, domain);\n printResult(\n await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.transferDomain(domain, { ...baseData, dry_run: false }, idempotencyKey),\n ),\n getFormat(parent),\n );\n });\n\n addPurchaseOptions(\n parent\n .command('renew <domain>')\n .description('ドメイン契約を更新')\n .requiredOption('--years <n>', '更新年数(1~5)')\n .requiredOption('--current-expiry-date <date>', '現在の有効期限(YYYY-MM-DD)'),\n ).action(async (\n domain: string,\n opts: PurchaseOptions & { years: string; currentExpiryDate: string },\n ) => {\n const { expectedTotalPrice, idempotencyKey } = purchaseValues(opts);\n const client = resolveClient(parent, brand);\n const baseData = {\n years: parseInteger(opts.years, '--years', 1, 5),\n current_expiry_date: validateDate(opts.currentExpiryDate, '--current-expiry-date'),\n expected_total_price: expectedTotalPrice,\n };\n const preview = await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.renewDomain(domain, { ...baseData, dry_run: true }),\n );\n if (opts.dryRun) {\n printResult(preview, getFormat(parent));\n return;\n }\n printPreview(preview, getFormat(parent));\n const totalPrice = totalPriceFromPreview(preview, expectedTotalPrice);\n printPurchaseWarning('ドメイン契約更新', domain, totalPrice, brand);\n requirePurchaseConfirmation(opts);\n await confirmBillingPurchase({\n operation: 'ドメイン契約更新',\n domain,\n totalPrice,\n brand,\n });\n printIdempotencyKeyNotice(idempotencyKey, domain);\n printResult(\n await withDomainAcquisitionPermissionDiagnosis(\n client,\n () => client.renewDomain(domain, { ...baseData, dry_run: false }, idempotencyKey),\n ),\n getFormat(parent),\n );\n });\n}\n","const DNS_TYPES = new Set(['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SRV']);\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_-]{8,64}$/;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function parseInteger(\n value: string,\n optionName: string,\n minimum: number,\n maximum?: number,\n): number {\n if (!/^\\d+$/.test(value)) {\n throw new Error(`${optionName} は整数で指定してください`);\n }\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < minimum || (maximum !== undefined && parsed > maximum)) {\n const range = maximum === undefined ? `${minimum}以上` : `${minimum}~${maximum}`;\n throw new Error(`${optionName} は${range}の整数で指定してください`);\n }\n return parsed;\n}\n\nexport function parseStrictBoolean(value: string, optionName: string): boolean {\n if (value === 'true') return true;\n if (value === 'false') return false;\n throw new Error(`${optionName} は true または false を指定してください`);\n}\n\nexport function parseNameservers(value: string): string[] {\n const nameservers = value.split(',').map((item) => item.trim()).filter(Boolean);\n if (nameservers.length < 1 || nameservers.length > 13) {\n throw new Error('--nameservers は1~13件をカンマ区切りで指定してください');\n }\n validateNameserverHostnames(nameservers, 253);\n if (new Set(nameservers.map((item) => item.toLowerCase())).size !== nameservers.length) {\n throw new Error('ネームサーバーを重複して指定できません');\n }\n return nameservers;\n}\n\nexport function parseRegistrationNameservers(value: string): string[] {\n const nameservers = value.split(',').map((item) => item.trim()).filter(Boolean);\n if (nameservers.length < 1 || nameservers.length > 6) {\n throw new Error('--nameservers は1~6件をカンマ区切りで指定してください');\n }\n validateNameserverHostnames(nameservers, 255);\n if (new Set(nameservers.map((item) => item.toLowerCase())).size !== nameservers.length) {\n throw new Error('ネームサーバーを重複して指定できません');\n }\n return nameservers;\n}\n\nfunction validateNameserverHostnames(nameservers: string[], maximumLength: number): void {\n const hostnamePattern = /^[A-Za-z0-9]([A-Za-z0-9.-]*[A-Za-z0-9])?$/;\n for (const nameserver of nameservers) {\n if (nameserver.length > maximumLength || !hostnamePattern.test(nameserver)) {\n throw new Error(`ネームサーバーは各${maximumLength}文字以内のホスト名で指定してください`);\n }\n }\n}\n\nexport function parseWhoisData(value: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new Error('--data は有効なJSONで指定してください');\n }\n if (!isObject(parsed)) {\n throw new Error('--data はJSONオブジェクトで指定してください');\n }\n if (Object.prototype.hasOwnProperty.call(parsed, 'whois_privacy_flag')) {\n throw new Error('whois_privacy_flag は廃止されています。whois_privacy を使用してください');\n }\n const hasPrivacy = Object.prototype.hasOwnProperty.call(parsed, 'whois_privacy');\n const hasFields = Object.prototype.hasOwnProperty.call(parsed, 'fields');\n if (!hasPrivacy && !hasFields) {\n throw new Error('--data には whois_privacy または fields のいずれかが必要です');\n }\n if (hasPrivacy && typeof parsed.whois_privacy !== 'boolean') {\n throw new Error('whois_privacy はbooleanで指定してください');\n }\n if (hasFields && !isObject(parsed.fields)) {\n throw new Error('fields はJSONオブジェクトで指定してください');\n }\n return parsed;\n}\n\nexport function validateDnsType(value: string): string {\n const type = value.toUpperCase();\n if (!DNS_TYPES.has(type)) {\n throw new Error('--type は A / AAAA / CNAME / MX / TXT / NS / SRV のいずれかを指定してください');\n }\n return type;\n}\n\nexport function validateDnsHost(value: string): string {\n if (value.length === 0 || value.length > 64) {\n throw new Error('--host は1~64文字で指定してください');\n }\n return value;\n}\n\nexport function validateDnsContent(value: string): string {\n if (value.length === 0 || value.length > 1024) {\n throw new Error('--content は1~1024文字で指定してください');\n }\n return value;\n}\n\nexport function validateDnsId(value: string): string {\n if (!/^[1-9]\\d*$/.test(value)) {\n throw new Error('dns_id は正の整数で指定してください');\n }\n return value;\n}\n\nexport function validateIdempotencyKey(value: string): string {\n if (!IDEMPOTENCY_KEY_PATTERN.test(value)) {\n throw new Error('--idempotency-key は英数字・_・-の8~64文字で指定してください');\n }\n return value;\n}\n\nexport function validateDate(value: string, optionName: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new Error(`${optionName} はYYYY-MM-DD形式で指定してください`);\n }\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n if (\n date.getUTCFullYear() !== year\n || date.getUTCMonth() !== month - 1\n || date.getUTCDate() !== day\n ) {\n throw new Error(`${optionName} に存在する日付を指定してください`);\n }\n return value;\n}\n\nexport function requireAtLeastOneField(data: Record<string, unknown>, message: string): void {\n if (Object.keys(data).length === 0) {\n throw new Error(message);\n }\n}\n","import { randomUUID } from 'node:crypto';\r\nimport type { Command } from 'commander';\r\nimport type { ApiClient, BrandConfig } from 'xnp-shared';\r\nimport {\r\n confirmDestructiveAction,\r\n getFormat,\r\n pickDefined,\r\n printPreview,\r\n printResult,\r\n resolveClient,\r\n} from '../../lib/command-helper.js';\r\nimport {\r\n parseWphostingBoolean,\r\n parseWphostingInteger,\r\n requireWphostingFields,\r\n validateWphostingContractId,\r\n validateWphostingDate,\r\n validateWphostingDnsType,\r\n validateWphostingEmail,\r\n validateWphostingEnum,\r\n validateWphostingIdempotencyKey,\r\n validateWphostingLength,\r\n validateWphostingOpaqueId,\r\n validateWphostingPositiveId,\r\n validateWphostingSecurityKey,\r\n validateWphostingServerId,\r\n validateWphostingServername,\r\n validateWphostingSitePassword,\r\n validateWphostingWpLogin,\r\n} from '../../lib/wphosting-validation.js';\r\n\r\ntype Options = Record<string, string | boolean | undefined>;\r\n\r\nfunction client(parent: Command, brand: BrandConfig): ApiClient {\r\n return resolveClient(parent, brand);\r\n}\r\n\r\nfunction contractId(parent: Command): string {\r\n return validateWphostingContractId(String(parent.opts().contractId));\r\n}\r\n\r\nfunction servername(opts: Options): string {\r\n return validateWphostingServername(String(opts.servername));\r\n}\r\n\r\nfunction siteCategory(parent: Command, name: string, description: string): Command {\r\n const category = parent.command(name).description(description)\r\n .requiredOption('--servername <site>', '対象サイトのservername(明示指定必須)');\r\n category.hook('preAction', (_command, actionCommand) => {\r\n actionCommand.setOptionValue('servername', actionCommand.optsWithGlobals().servername);\r\n });\r\n return category;\r\n}\r\n\r\nfunction asyncKey(opts: Options): string {\r\n const key = validateWphostingIdempotencyKey(String(opts.idempotencyKey ?? randomUUID()));\r\n console.error(`Idempotency-Key: ${key}(再実行時は同じキーを指定してください)`);\r\n return key;\r\n}\r\n\r\nfunction asyncOption(command: Command): Command {\r\n return command.option('--idempotency-key <key>', '冪等性キー(未指定時は自動生成)');\r\n}\r\n\r\nfunction objectRows(response: unknown, keys: string[]): Array<Record<string, unknown>> {\r\n if (typeof response !== 'object' || response === null) return [];\r\n const record = response as Record<string, unknown>;\r\n for (const key of keys) {\r\n if (Array.isArray(record[key])) return record[key] as Array<Record<string, unknown>>;\r\n }\r\n return [];\r\n}\r\n\r\nfunction findTarget(response: unknown, keys: string[], id: string, idKeys: string[]): Record<string, unknown> | undefined {\r\n return objectRows(response, keys).find((row) => idKeys.some((key) => String(row[key]) === id));\r\n}\r\n\r\nasync function previewListTarget(\r\n parent: Command,\r\n response: unknown,\r\n keys: string[],\r\n id: string,\r\n idKeys: string[],\r\n label: string,\r\n): Promise<void> {\r\n const target = findTarget(response, keys, id, idKeys);\r\n if (!target) throw new Error(`${label} \"${id}\" を一覧から確認できませんでした`);\r\n printPreview(target, getFormat(parent));\r\n}\r\n\r\nfunction resourceData(opts: Options): Record<string, unknown> {\r\n return {\r\n disk_limit_gb: parseWphostingInteger(String(opts.diskLimitGb), '--disk-limit-gb', 10),\r\n vcpu_limit: parseWphostingInteger(String(opts.vcpuLimit), '--vcpu-limit', 1),\r\n memory_limit_gb: parseWphostingInteger(String(opts.memoryLimitGb), '--memory-limit-gb', 1),\r\n };\r\n}\r\n\r\nfunction pluginThemeData(opts: Options, theme: boolean): Record<string, unknown> {\r\n const data = pickDefined({\r\n status: opts.status === undefined\r\n ? undefined\r\n : validateWphostingEnum(String(opts.status), '--status', theme ? ['active'] : ['active', 'inactive']),\r\n auto_update: opts.autoUpdate === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.autoUpdate), '--auto-update'),\r\n });\r\n requireWphostingFields(data);\r\n return data;\r\n}\r\n\r\nfunction dnsData(opts: Options, required: boolean): Record<string, unknown> {\r\n const data = pickDefined({\r\n host: opts.host,\r\n type: opts.type === undefined ? undefined : validateWphostingDnsType(String(opts.type)),\r\n content: opts.content,\r\n ttl: opts.ttl === undefined ? undefined : parseWphostingInteger(String(opts.ttl), '--ttl', 60, 86400),\r\n priority: opts.priority === undefined\r\n ? undefined\r\n : parseWphostingInteger(String(opts.priority), '--priority', 0, 65535),\r\n });\r\n if (!required) requireWphostingFields(data);\r\n return data;\r\n}\r\n\r\nfunction addDnsOptions(command: Command, required: boolean): Command {\r\n const option = required ? 'requiredOption' : 'option';\r\n command[option]('--host <host>', 'ホスト名(@でapex)');\r\n command[option]('--type <type>', 'A / AAAA / CNAME / MX / TXT / SRV');\r\n command[option]('--content <content>', 'レコード値');\r\n return command.option('--ttl <seconds>', 'TTL(60~86400)')\r\n .option('--priority <n>', '優先度(0~65535)');\r\n}\r\n\r\nfunction cronData(opts: Options, required: boolean): Record<string, unknown> {\r\n const data = pickDefined({\r\n minute: opts.minute,\r\n hour: opts.hour,\r\n day: opts.day,\r\n month: opts.month,\r\n weekday: opts.weekday,\r\n command: opts.command,\r\n comment: opts.comment,\r\n enabled: opts.enabled === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.enabled), '--enabled'),\r\n });\r\n if (!required) requireWphostingFields(data);\r\n return data;\r\n}\r\n\r\nexport function registerWphostingCommands(parent: Command, brand: BrandConfig): void {\r\n const cid = () => contractId(parent);\r\n const api = () => client(parent, brand);\r\n\r\n const sites = parent.command('sites').description('サイト情報・作成・削除');\r\n sites.command('list').description('サイト一覧を取得').action(async () => {\r\n printResult(await api().listWphostingSites(cid()), getFormat(parent));\r\n });\r\n sites.command('show').description('サイト詳細を取得')\r\n .requiredOption('--servername <site>', '対象サイトのservername(明示指定必須)')\r\n .action(async (opts: Options) => {\r\n printResult(await api().getWphostingSite(cid(), servername(opts)), getFormat(parent));\r\n });\r\n asyncOption(sites.command('create').description('サイトを作成')\r\n .requiredOption('--wp-sitename <name>', 'WordPressサイト名')\r\n .requiredOption('--wp-username <name>', 'WordPress管理ユーザー')\r\n .requiredOption('--wp-password <password>', 'WordPress管理パスワード(7~64文字)')\r\n .requiredOption('--wp-mailaddress <email>', 'WordPress管理メールアドレス')\r\n .requiredOption('--disk-limit-gb <gb>', 'ディスク上限GB(10以上)')\r\n .requiredOption('--vcpu-limit <n>', 'vCPU上限(1以上)')\r\n .requiredOption('--memory-limit-gb <gb>', 'メモリ上限GB(1以上)')\r\n .option('--wp-theme <theme>', 'default / cocoon-master / lightning')\r\n .option('--server-id <id>', '初期URLのサーバーID')\r\n .option('--security-auto-optimize <bool>', 'セキュリティ自動最適化(true / false)')\r\n .option('--memo <memo>', 'メモ(255文字以内)'))\r\n .action(async (opts: Options) => {\r\n const data = {\r\n ...resourceData(opts),\r\n wp_sitename: validateWphostingLength(String(opts.wpSitename), '--wp-sitename', 255),\r\n wp_username: validateWphostingWpLogin(String(opts.wpUsername), '--wp-username', 255, true),\r\n wp_password: validateWphostingSitePassword(String(opts.wpPassword), String(opts.wpUsername)),\r\n wp_mailaddress: validateWphostingEmail(String(opts.wpMailaddress), '--wp-mailaddress'),\r\n ...pickDefined({\r\n wp_theme: opts.wpTheme === undefined\r\n ? undefined\r\n : validateWphostingEnum(String(opts.wpTheme), '--wp-theme', ['default', 'cocoon-master', 'lightning']),\r\n server_id: opts.serverId === undefined ? undefined : validateWphostingServerId(String(opts.serverId)),\r\n security_auto_optimize: opts.securityAutoOptimize === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.securityAutoOptimize), '--security-auto-optimize'),\r\n memo: opts.memo === undefined ? undefined : validateWphostingLength(String(opts.memo), '--memo', 255),\r\n }),\r\n };\r\n const result = await api().createWphostingSite(cid(), data, asyncKey(opts));\r\n printResult(result, getFormat(parent));\r\n });\r\n asyncOption(sites.command('delete').description('サイトを削除')\r\n .requiredOption('--servername <site>', '対象サイトのservername(明示指定必須)')\r\n .option('-y, --yes', '確認プロンプトをスキップ'))\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const detail = await api().getWphostingSite(cid(), site);\r\n printPreview(detail, getFormat(parent));\r\n console.error('警告: 本番サイトを削除すると、紐づくステージング環境も連動して削除されます。');\r\n await confirmDestructiveAction(parent, `サイト \"${site}\" を削除します。元に戻せません。よろしいですか?`);\r\n printResult(await api().deleteWphostingSite(cid(), site, asyncKey(opts)), getFormat(parent));\r\n });\r\n\r\n parent.command('usage').description('契約上限とサイト別使用量')\r\n .command('show').description('利用状況を取得').action(async () => {\r\n printResult(await api().getWphostingUsage(cid()), getFormat(parent));\r\n });\r\n\r\n const staging = siteCategory(parent, 'staging', 'ステージング環境');\r\n asyncOption(staging.command('create').description('ステージング環境を作成')\r\n .requiredOption('--disk-limit-gb <gb>', 'ディスク上限GB(10以上)')\r\n .requiredOption('--vcpu-limit <n>', 'vCPU上限(1以上)')\r\n .requiredOption('--memory-limit-gb <gb>', 'メモリ上限GB(1以上)')\r\n .option('--server-id <id>', 'ステージングURLのサーバーID')\r\n .option('--security-auto-optimize <bool>', 'セキュリティ自動最適化(true / false)'))\r\n .action(async (opts: Options) => {\r\n const data = {\r\n ...resourceData(opts),\r\n ...pickDefined({\r\n server_id: opts.serverId === undefined ? undefined : validateWphostingServerId(String(opts.serverId)),\r\n security_auto_optimize: opts.securityAutoOptimize === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.securityAutoOptimize), '--security-auto-optimize'),\r\n }),\r\n };\r\n const result = await api().createWphostingStaging(cid(), servername(opts), data, asyncKey(opts));\r\n printResult(result, getFormat(parent));\r\n });\r\n\r\n const backups = siteCategory(parent, 'backups', '手動バックアップ');\r\n backups.command('list').description('バックアップ一覧を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingBackups(cid(), servername(opts)), getFormat(parent));\r\n });\r\n asyncOption(backups.command('create').description('バックアップを作成')\r\n .option('--memo <memo>', 'メモ(255文字以内)'))\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const data = pickDefined({\r\n memo: opts.memo === undefined ? undefined : validateWphostingLength(String(opts.memo), '--memo', 255),\r\n });\r\n printResult(await api().createWphostingBackup(cid(), site, data, asyncKey(opts)), getFormat(parent));\r\n });\r\n asyncOption(backups.command('restore').description('バックアップを復元')\r\n .requiredOption('--backup-id <id>', '復元するバックアップID')\r\n .option('-y, --yes', '確認プロンプトをスキップ'))\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const backupId = validateWphostingOpaqueId(String(opts.backupId), '--backup-id');\r\n const list = await api().listWphostingBackups(cid(), site);\r\n await previewListTarget(parent, list, ['backups'], backupId, ['id', 'backup_id'], 'バックアップ');\r\n console.error('警告: 現在のサイト内容はバックアップ内容で上書きされ、復元操作は取り消せません。');\r\n await confirmDestructiveAction(parent, `バックアップ \"${backupId}\" を復元します。よろしいですか?`);\r\n printResult(await api().restoreWphostingBackup(cid(), site, backupId, asyncKey(opts)), getFormat(parent));\r\n });\r\n backups.command('restore-history').description('復元履歴を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingBackupRestoreHistory(cid(), servername(opts)), getFormat(parent));\r\n });\r\n backups.command('delete').description('バックアップを削除')\r\n .requiredOption('--backup-id <id>', '削除するバックアップID')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const id = validateWphostingOpaqueId(String(opts.backupId), '--backup-id');\r\n await previewListTarget(parent, await api().listWphostingBackups(cid(), site), ['backups'], id, ['id', 'backup_id'], 'バックアップ');\r\n await confirmDestructiveAction(parent, `バックアップ \"${id}\" を削除します。削除後は復元できません。よろしいですか?`);\r\n printResult(await api().deleteWphostingBackup(cid(), site, id), getFormat(parent));\r\n });\r\n\r\n const wordpress = siteCategory(parent, 'wordpress', 'WordPress本体');\r\n wordpress.command('show').description('WordPress情報を取得').action(async (opts: Options) => {\r\n printResult(await api().getWphostingWordPress(cid(), servername(opts)), getFormat(parent));\r\n });\r\n wordpress.command('update').description('WordPress自動更新設定を変更')\r\n .requiredOption('--auto-update-scope <scope>', 'none / minor / all')\r\n .action(async (opts: Options) => {\r\n const data = { auto_update_scope: validateWphostingEnum(String(opts.autoUpdateScope), '--auto-update-scope', ['none', 'minor', 'all']) };\r\n printResult(await api().updateWphostingWordPress(cid(), servername(opts), data), getFormat(parent));\r\n });\r\n wordpress.command('upgrade').description('WordPress本体を更新').action(async (opts: Options) => {\r\n printResult(await api().upgradeWphostingWordPress(cid(), servername(opts)), getFormat(parent));\r\n });\r\n\r\n const maintenance = siteCategory(parent, 'maintenance-mode', 'メンテナンスモード');\r\n maintenance.command('show').description('設定を取得').action(async (opts: Options) => {\r\n printResult(await api().getWphostingMaintenanceMode(cid(), servername(opts)), getFormat(parent));\r\n });\r\n maintenance.command('update').description('設定を変更').requiredOption('--enabled <bool>', 'true / false')\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingMaintenanceMode(cid(), servername(opts), {\r\n enabled: parseWphostingBoolean(String(opts.enabled), '--enabled'),\r\n }), getFormat(parent));\r\n });\r\n\r\n registerExtensionCommands(parent, brand, 'plugins');\r\n registerExtensionCommands(parent, brand, 'themes');\r\n\r\n const domains = siteCategory(parent, 'domains', 'サイトのドメイン設定');\r\n domains.command('list').description('ドメイン一覧を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingDomains(cid(), servername(opts)), getFormat(parent));\r\n });\r\n domains.command('add').description('ドメインを追加').requiredOption('--domain <domain>', '追加するドメイン')\r\n .action(async (opts: Options) => {\r\n printResult(await api().addWphostingDomain(cid(), servername(opts), { domain: String(opts.domain) }), getFormat(parent));\r\n });\r\n domains.command('verify').description('ドメイン所有者確認を実行').requiredOption('--domain <domain>', '確認するドメイン')\r\n .action(async (opts: Options) => {\r\n printResult(await api().verifyWphostingDomain(cid(), servername(opts), String(opts.domain)), getFormat(parent));\r\n });\r\n domains.command('delete').description('ドメインを削除')\r\n .requiredOption('--domain <domain>', '削除するドメイン')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const domain = String(opts.domain);\r\n await previewListTarget(parent, await api().listWphostingDomains(cid(), site), ['domains'], domain, ['domain', 'name'], 'ドメイン');\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domain}\" を削除します。よろしいですか?`);\r\n printResult(await api().deleteWphostingDomain(cid(), site, domain), getFormat(parent));\r\n });\r\n\r\n const siteUrl = siteCategory(parent, 'site-url', 'プライマリドメイン');\r\n siteUrl.command('update').description('サイトURLを変更').requiredOption('--domain <domain>', '変更先ドメイン')\r\n .option('--auto-redirect <bool>', '旧URLから新URLへ自動転送(true / false、未指定時true)')\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingSiteUrl(cid(), servername(opts), pickDefined({\r\n domain: String(opts.domain),\r\n auto_redirect: opts.autoRedirect === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.autoRedirect), '--auto-redirect'),\r\n })), getFormat(parent));\r\n });\r\n\r\n const dns = siteCategory(parent, 'dns', 'WPhostingサイトのDNSレコード');\r\n dns.command('list').description('DNSレコード一覧を取得').requiredOption('--domain <domain>', '対象ドメイン')\r\n .action(async (opts: Options) => {\r\n printResult(await api().listWphostingDnsRecords(cid(), servername(opts), String(opts.domain)), getFormat(parent));\r\n });\r\n addDnsOptions(dns.command('add').description('DNSレコードを追加').requiredOption('--domain <domain>', '対象ドメイン'), true)\r\n .action(async (opts: Options) => {\r\n printResult(await api().addWphostingDnsRecord(cid(), servername(opts), String(opts.domain), dnsData(opts, true)), getFormat(parent));\r\n });\r\n addDnsOptions(dns.command('update').description('DNSレコードを更新')\r\n .requiredOption('--domain <domain>', '対象ドメイン').requiredOption('--dns-id <id>', 'DNSレコードID'), false)\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingDnsRecord(\r\n cid(), servername(opts), String(opts.domain),\r\n validateWphostingPositiveId(String(opts.dnsId), '--dns-id'), dnsData(opts, false),\r\n ), getFormat(parent));\r\n });\r\n dns.command('delete').description('DNSレコードを削除')\r\n .requiredOption('--domain <domain>', '対象ドメイン').requiredOption('--dns-id <id>', 'DNSレコードID')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const domain = String(opts.domain);\r\n const id = validateWphostingPositiveId(String(opts.dnsId), '--dns-id');\r\n await previewListTarget(parent, await api().listWphostingDnsRecords(cid(), site, domain), ['records', 'dns_records'], id, ['id', 'dns_id'], 'DNSレコード');\r\n await confirmDestructiveAction(parent, `DNSレコード \"${id}\" を削除します。よろしいですか?`);\r\n printResult(await api().deleteWphostingDnsRecord(cid(), site, domain, id), getFormat(parent));\r\n });\r\n\r\n const phpVersion = siteCategory(parent, 'php-version', 'PHPバージョン');\r\n phpVersion.command('show').description('PHPバージョンを取得').action(async (opts: Options) => {\r\n printResult(await api().getWphostingPhpVersion(cid(), servername(opts)), getFormat(parent));\r\n });\r\n phpVersion.command('update').description('PHPバージョンを変更').requiredOption('--php <version>', 'GETで取得したavailableの値')\r\n .action(async (opts: Options) => {\r\n if (!/^\\d+\\.\\d+$/.test(String(opts.php))) throw new Error('--php は 8.3 のような形式で指定してください');\r\n printResult(await api().updateWphostingPhpVersion(cid(), servername(opts), { version: String(opts.php) }), getFormat(parent));\r\n });\r\n\r\n registerLogCommand(parent, brand, 'access-log', true);\r\n registerLogCommand(parent, brand, 'error-log', false);\r\n registerWphostingCron(parent, brand);\r\n registerWphostingSsh(parent, brand);\r\n registerWphostingUsers(parent, brand);\r\n\r\n const security = siteCategory(parent, 'security', 'WordPressセキュリティ設定');\r\n security.command('list').description('公開セキュリティ設定を取得').action(async (opts: Options) => {\r\n printResult(await api().getWphostingSecurity(cid(), servername(opts)), getFormat(parent));\r\n });\r\n security.command('update').description('セキュリティ設定を変更')\r\n .requiredOption('--key <key>', '公開対象の設定キー')\r\n .requiredOption('--enabled <bool>', 'true / false')\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingSecurity(\r\n cid(), servername(opts), validateWphostingSecurityKey(String(opts.key)),\r\n { is_enable: parseWphostingBoolean(String(opts.enabled), '--enabled') },\r\n ), getFormat(parent));\r\n });\r\n}\r\n\r\nfunction registerExtensionCommands(parent: Command, brand: BrandConfig, kind: 'plugins' | 'themes'): void {\r\n const singular = kind === 'plugins' ? 'plugin' : 'theme';\r\n const category = siteCategory(parent, kind, kind === 'plugins' ? 'WordPressプラグイン' : 'WordPressテーマ');\r\n const methodKind = kind === 'plugins' ? 'Plugin' : 'Theme';\r\n const api = () => client(parent, brand);\r\n const cid = () => contractId(parent);\r\n category.command('list').description('一覧を取得').action(async (opts: Options) => {\r\n printResult(await api()[`listWphosting${methodKind}s`](cid(), servername(opts)), getFormat(parent));\r\n });\r\n category.command('install').description('公式リポジトリからインストール')\r\n .requiredOption(`--${singular} <slug>`, `${singular} slug`)\r\n .option('--activate <bool>', 'インストール後に有効化(true / false、未指定時false)')\r\n .action(async (opts: Options) => {\r\n const slug = String(opts[singular]);\r\n printResult(await api()[`installWphosting${methodKind}`](cid(), servername(opts), pickDefined({\r\n [singular]: slug,\r\n activate: opts.activate === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.activate), '--activate'),\r\n })), getFormat(parent));\r\n });\r\n category.command('update').description('状態・自動更新設定を変更')\r\n .requiredOption(`--${singular} <slug>`, `${singular} slug`)\r\n .option('--status <status>', kind === 'plugins' ? 'active / inactive' : 'active')\r\n .option('--auto-update <bool>', 'true / false')\r\n .action(async (opts: Options) => {\r\n printResult(await api()[`updateWphosting${methodKind}`](\r\n cid(), servername(opts), String(opts[singular]), pluginThemeData(opts, kind === 'themes'),\r\n ), getFormat(parent));\r\n });\r\n category.command('upgrade').description('バージョン更新を実行')\r\n .requiredOption(`--${singular} <slug>`, `${singular} slug`)\r\n .action(async (opts: Options) => {\r\n printResult(await api()[`upgradeWphosting${methodKind}`](cid(), servername(opts), String(opts[singular])), getFormat(parent));\r\n });\r\n category.command('delete').description('削除')\r\n .requiredOption(`--${singular} <slug>`, `${singular} slug`)\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const slug = String(opts[singular]);\r\n const list = await api()[`listWphosting${methodKind}s`](cid(), site);\r\n await previewListTarget(parent, list, [kind], slug, [singular, 'slug', 'name'], singular);\r\n await confirmDestructiveAction(parent, `${singular} \"${slug}\" を削除します。よろしいですか?`);\r\n printResult(await api()[`deleteWphosting${methodKind}`](cid(), site, slug), getFormat(parent));\r\n });\r\n}\r\n\r\nfunction registerLogCommand(parent: Command, brand: BrandConfig, name: 'access-log' | 'error-log', hasDate: boolean): void {\r\n const category = siteCategory(parent, name, name === 'access-log' ? 'アクセスログ' : 'エラーログ');\r\n const command = category.command('show').description('ログを取得')\r\n .option('--keyword <keyword>', '絞り込みキーワード')\r\n .option('--line-number <n>', '取得行数(1~50000)');\r\n if (hasDate) command.option('--date <date>', '対象日(YYYY-MM-DD)');\r\n command.action(async (opts: Options) => {\r\n const params: Record<string, string> = pickDefined({\r\n date: opts.date === undefined ? undefined : validateWphostingDate(String(opts.date)),\r\n keyword: opts.keyword === undefined ? undefined : String(opts.keyword),\r\n line_number: opts.lineNumber === undefined\r\n ? undefined\r\n : String(parseWphostingInteger(String(opts.lineNumber), '--line-number', 1, 50000)),\r\n }) as Record<string, string>;\r\n const method = hasDate ? 'getWphostingAccessLog' : 'getWphostingErrorLog';\r\n printResult(await client(parent, brand)[method](contractId(parent), servername(opts), params), getFormat(parent));\r\n });\r\n}\r\n\r\nfunction registerWphostingCron(parent: Command, brand: BrandConfig): void {\r\n const cron = siteCategory(parent, 'cron', 'WPhostingサイトのCron設定');\r\n const api = () => client(parent, brand);\r\n const cid = () => contractId(parent);\r\n cron.command('list').description('Cron一覧を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingCron(cid(), servername(opts)), getFormat(parent));\r\n });\r\n cron.command('add').description('Cronを追加')\r\n .requiredOption('--minute <value>', '分')\r\n .requiredOption('--hour <value>', '時')\r\n .requiredOption('--day <value>', '日')\r\n .requiredOption('--month <value>', '月')\r\n .requiredOption('--weekday <value>', '曜日')\r\n .requiredOption('--command <command>', '実行コマンド')\r\n .option('--comment <comment>', 'コメント')\r\n .action(async (opts: Options) => {\r\n printResult(await api().addWphostingCron(cid(), servername(opts), cronData(opts, true)), getFormat(parent));\r\n });\r\n cron.command('update').description('Cronを更新').requiredOption('--cron-id <id>', 'Cron ID')\r\n .option('--minute <value>', '分').option('--hour <value>', '時').option('--day <value>', '日')\r\n .option('--month <value>', '月').option('--weekday <value>', '曜日')\r\n .option('--command <command>', '実行コマンド').option('--comment <comment>', 'コメント')\r\n .option('--enabled <bool>', 'true / false')\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingCron(\r\n cid(), servername(opts), validateWphostingOpaqueId(String(opts.cronId), '--cron-id'), cronData(opts, false),\r\n ), getFormat(parent));\r\n });\r\n cron.command('delete').description('Cronを削除').requiredOption('--cron-id <id>', 'Cron ID')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const id = validateWphostingOpaqueId(String(opts.cronId), '--cron-id');\r\n await previewListTarget(parent, await api().listWphostingCron(cid(), site), ['cron', 'crons'], id, ['id', 'cron_id'], 'Cron');\r\n await confirmDestructiveAction(parent, `Cron \"${id}\" を削除します。よろしいですか?`);\r\n printResult(await api().deleteWphostingCron(cid(), site, id), getFormat(parent));\r\n });\r\n}\r\n\r\nfunction registerWphostingSsh(parent: Command, brand: BrandConfig): void {\r\n const ssh = siteCategory(parent, 'ssh', 'WPhostingサイトのSSH設定');\r\n const api = () => client(parent, brand);\r\n const cid = () => contractId(parent);\r\n ssh.command('show').description('SSH設定を取得').action(async (opts: Options) => {\r\n printResult(await api().getWphostingSsh(cid(), servername(opts)), getFormat(parent));\r\n });\r\n ssh.command('update').description('SSH設定を変更')\r\n .option('--ssh-enabled <bool>', 'SSHを有効化(true / false)')\r\n .option('--abroad-access-restriction <bool>', '国外アクセス制限(true / false)')\r\n .action(async (opts: Options) => {\r\n const data = pickDefined({\r\n ssh_enabled: opts.sshEnabled === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.sshEnabled), '--ssh-enabled'),\r\n abroad_access_restriction: opts.abroadAccessRestriction === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.abroadAccessRestriction), '--abroad-access-restriction'),\r\n });\r\n requireWphostingFields(data);\r\n printResult(await api().updateWphostingSsh(cid(), servername(opts), data), getFormat(parent));\r\n });\r\n const keys = ssh.command('keys').description('SSH公開鍵');\r\n keys.command('list').description('公開鍵一覧を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingSshKeys(cid(), servername(opts)), getFormat(parent));\r\n });\r\n keys.command('add').description('公開鍵を登録または生成')\r\n .requiredOption('--label <label>', 'ラベル(1~500文字)')\r\n .option('--public-key <key>', '登録する公開鍵')\r\n .option('--generate <bool>', '鍵ペアを生成(true / false)')\r\n .option('--passphrase <passphrase>', '生成鍵のパスフレーズ')\r\n .action(async (opts: Options) => {\r\n const generate = opts.generate === undefined ? false : parseWphostingBoolean(String(opts.generate), '--generate');\r\n if (!generate && opts.publicKey === undefined) throw new Error('--public-key または --generate true が必要です');\r\n if (generate && opts.publicKey !== undefined) throw new Error('--generate true と --public-key は同時に指定できません');\r\n if (!generate && opts.passphrase !== undefined) throw new Error('--passphrase は --generate true の場合だけ指定できます');\r\n const data = pickDefined({\r\n label: validateWphostingLength(String(opts.label), '--label', 500),\r\n public_key: opts.publicKey,\r\n generate: generate || undefined,\r\n passphrase: opts.passphrase === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.passphrase), '--passphrase', 32, 6),\r\n });\r\n if (generate) console.error('注意: 生成されたprivate_keyはこの応答で一度だけ表示されます。安全な場所へ直ちに保存してください。');\r\n printResult(await api().addWphostingSshKey(cid(), servername(opts), data), getFormat(parent));\r\n });\r\n keys.command('update').description('公開鍵を更新').requiredOption('--key-id <id>', '公開鍵ID')\r\n .option('--label <label>', 'ラベル(1~500文字)').option('--status <status>', 'on / off')\r\n .action(async (opts: Options) => {\r\n const data = pickDefined({\r\n label: opts.label === undefined ? undefined : validateWphostingLength(String(opts.label), '--label', 500),\r\n status: opts.status === undefined ? undefined : validateWphostingEnum(String(opts.status), '--status', ['on', 'off']),\r\n });\r\n requireWphostingFields(data);\r\n printResult(await api().updateWphostingSshKey(\r\n cid(), servername(opts), validateWphostingPositiveId(String(opts.keyId), '--key-id'), data,\r\n ), getFormat(parent));\r\n });\r\n keys.command('delete').description('公開鍵を削除').requiredOption('--key-id <id>', '公開鍵ID')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const id = validateWphostingPositiveId(String(opts.keyId), '--key-id');\r\n await previewListTarget(parent, await api().listWphostingSshKeys(cid(), site), ['keys', 'ssh_keys'], id, ['id', 'key_id'], 'SSH公開鍵');\r\n await confirmDestructiveAction(parent, `SSH公開鍵 \"${id}\" を削除します。よろしいですか?`);\r\n printResult(await api().deleteWphostingSshKey(cid(), site, id), getFormat(parent));\r\n });\r\n}\r\n\r\nfunction wpUserData(opts: Options, create: boolean): Record<string, unknown> {\r\n const data = pickDefined({\r\n user_login: opts.userLogin === undefined\r\n ? undefined\r\n : validateWphostingWpLogin(String(opts.userLogin), '--user-login', 60),\r\n user_email: opts.userEmail === undefined\r\n ? undefined\r\n : validateWphostingEmail(String(opts.userEmail), '--user-email'),\r\n user_pass: opts.userPass === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.userPass), '--user-pass', 64, 7),\r\n role: opts.role === undefined ? undefined : validateWphostingLength(String(opts.role), '--role', 64),\r\n display_name: opts.displayName === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.displayName), '--display-name', 255),\r\n first_name: opts.firstName === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.firstName), '--first-name', 255),\r\n last_name: opts.lastName === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.lastName), '--last-name', 255),\r\n user_url: opts.userUrl === undefined\r\n ? undefined\r\n : validateWphostingLength(String(opts.userUrl), '--user-url', 255),\r\n send_email: opts.sendEmail === undefined\r\n ? undefined\r\n : parseWphostingBoolean(String(opts.sendEmail), '--send-email'),\r\n });\r\n if (!create) requireWphostingFields(data);\r\n return data;\r\n}\r\n\r\nfunction addWpUserFields(command: Command, create: boolean): Command {\r\n const option = create ? 'requiredOption' : 'option';\r\n if (create) command.requiredOption('--user-login <login>', 'ユーザー名(60文字以内)');\r\n command[option]('--user-email <email>', 'メールアドレス(100文字以内)');\r\n command[option]('--user-pass <password>', 'パスワード(64文字以内)');\r\n command[option]('--role <role>', '権限グループ');\r\n command.option('--display-name <name>', '表示名').option('--first-name <name>', '名')\r\n .option('--last-name <name>', '姓').option('--user-url <url>', 'サイトURL');\r\n if (create) command.option('--send-email <bool>', '通知メール送信(true / false)');\r\n return command;\r\n}\r\n\r\nfunction registerWphostingUsers(parent: Command, brand: BrandConfig): void {\r\n const users = siteCategory(parent, 'wp-users', 'WordPressユーザー');\r\n const api = () => client(parent, brand);\r\n const cid = () => contractId(parent);\r\n users.command('roles').description('権限グループ一覧を取得').action(async (opts: Options) => {\r\n printResult(await api().listWphostingWpUserRoles(cid(), servername(opts)), getFormat(parent));\r\n });\r\n users.command('list').description('ユーザー一覧を取得')\r\n .option('--search <value>', '検索語')\r\n .option('--orderby <field>', 'ID / user_login / display_name / user_email / user_registered')\r\n .option('--order <order>', 'asc / desc')\r\n .action(async (opts: Options) => {\r\n const params: Record<string, string> = pickDefined({\r\n search: opts.search === undefined ? undefined : String(opts.search),\r\n orderby: opts.orderby === undefined\r\n ? undefined\r\n : validateWphostingEnum(String(opts.orderby), '--orderby', ['ID', 'user_login', 'display_name', 'user_email', 'user_registered']),\r\n order: opts.order === undefined ? undefined : validateWphostingEnum(String(opts.order), '--order', ['asc', 'desc']),\r\n }) as Record<string, string>;\r\n printResult(await api().listWphostingWpUsers(cid(), servername(opts), params), getFormat(parent));\r\n });\r\n addWpUserFields(users.command('create').description('ユーザーを作成'), true)\r\n .action(async (opts: Options) => {\r\n printResult(await api().createWphostingWpUser(cid(), servername(opts), wpUserData(opts, true)), getFormat(parent));\r\n });\r\n users.command('show').description('ユーザー詳細を取得').requiredOption('--user-id <id>', 'ユーザーID')\r\n .action(async (opts: Options) => {\r\n printResult(await api().getWphostingWpUser(\r\n cid(), servername(opts), validateWphostingPositiveId(String(opts.userId), '--user-id'),\r\n ), getFormat(parent));\r\n });\r\n addWpUserFields(users.command('update').description('ユーザーを更新').requiredOption('--user-id <id>', 'ユーザーID'), false)\r\n .action(async (opts: Options) => {\r\n printResult(await api().updateWphostingWpUser(\r\n cid(), servername(opts), validateWphostingPositiveId(String(opts.userId), '--user-id'), wpUserData(opts, false),\r\n ), getFormat(parent));\r\n });\r\n users.command('delete').description('ユーザーを削除').requiredOption('--user-id <id>', 'ユーザーID')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (opts: Options) => {\r\n const site = servername(opts);\r\n const id = validateWphostingPositiveId(String(opts.userId), '--user-id');\r\n const target = await api().getWphostingWpUser(cid(), site, id);\r\n printPreview(target, getFormat(parent));\r\n console.error('警告: このユーザーが所有する投稿なども削除されます。');\r\n await confirmDestructiveAction(parent, `WordPressユーザー \"${id}\" を削除します。よろしいですか?`);\r\n printResult(await api().deleteWphostingWpUser(cid(), site, id), getFormat(parent));\r\n });\r\n}\r\n","import type { BrandConfig } from 'xnp-shared';\r\n\r\nconst DNS_TYPES = new Set(['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'SRV']);\r\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_-]{8,64}$/;\r\n\r\nexport function isWphostingSupportedBrand(brand: Pick<BrandConfig, 'brand'>): boolean {\r\n return brand.brand === 'xserver';\r\n}\r\n\r\nexport function parseWphostingInteger(\r\n value: string,\r\n optionName: string,\r\n minimum: number,\r\n maximum?: number,\r\n): number {\r\n if (!/^\\d+$/.test(value)) throw new Error(`${optionName} は整数で指定してください`);\r\n const parsed = Number(value);\r\n if (!Number.isSafeInteger(parsed) || parsed < minimum || (maximum !== undefined && parsed > maximum)) {\r\n const range = maximum === undefined ? `${minimum}以上` : `${minimum}~${maximum}`;\r\n throw new Error(`${optionName} は${range}の整数で指定してください`);\r\n }\r\n return parsed;\r\n}\r\n\r\nexport function parseWphostingBoolean(value: string, optionName: string): boolean {\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n throw new Error(`${optionName} は true または false を指定してください`);\r\n}\r\n\r\nexport function validateWphostingEnum(value: string, optionName: string, allowed: readonly string[]): string {\r\n if (!allowed.includes(value)) {\r\n throw new Error(`${optionName} は ${allowed.join(' / ')} のいずれかを指定してください`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingContractId(value: string): string {\r\n if (value.length > 64 || !/^WP-[A-Za-z0-9]+$/.test(value)) {\r\n throw new Error('--contract-id は WP- で始まる英数字の契約IDを指定してください');\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingServername(value: string): string {\r\n if (value.length > 255 || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)) {\r\n throw new Error('--servername は英数字で始まる255文字以内の識別子で指定してください');\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingPositiveId(value: string, optionName: string): string {\r\n if (!/^[1-9]\\d*$/.test(value)) throw new Error(`${optionName} は正の整数で指定してください`);\r\n return value;\r\n}\r\n\r\nexport function validateWphostingOpaqueId(value: string, optionName: string): string {\r\n if (value.length > 255 || !/^[A-Za-z0-9_-]+$/.test(value)) {\r\n throw new Error(`${optionName} は英数字・_・-の255文字以内で指定してください`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingDnsType(value: string): string {\r\n const type = value.toUpperCase();\r\n if (!DNS_TYPES.has(type)) {\r\n throw new Error('--type は A / AAAA / CNAME / MX / TXT / SRV のいずれかを指定してください');\r\n }\r\n return type;\r\n}\r\n\r\nexport function validateWphostingDate(value: string, optionName = '--date'): string {\r\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new Error(`${optionName} はYYYY-MM-DD形式で指定してください`);\r\n const [year, month, day] = value.split('-').map(Number);\r\n const date = new Date(Date.UTC(year, month - 1, day));\r\n if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month - 1 || date.getUTCDate() !== day) {\r\n throw new Error(`${optionName} に存在する日付を指定してください`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingIdempotencyKey(value: string): string {\r\n if (!IDEMPOTENCY_KEY_PATTERN.test(value)) {\r\n throw new Error('--idempotency-key は英数字・_・-の8~64文字で指定してください');\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingSecurityKey(value: string): string {\r\n if (value.length > 100 || !/^[a-z0-9_]+$/.test(value)) {\r\n throw new Error('--key は security list で取得した設定キーを指定してください');\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingServerId(value: string): string {\r\n if (!/^[a-z][a-z0-9]{0,11}$/.test(value)) {\r\n throw new Error('--server-id は小文字英字で始まる12文字以内の小文字英数字で指定してください');\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingLength(value: string, optionName: string, maximum: number, minimum = 1): string {\r\n if (value.length < minimum || value.length > maximum) {\r\n throw new Error(`${optionName} は${minimum}~${maximum}文字で指定してください`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingEmail(value: string, optionName: string): string {\r\n validateWphostingLength(value, optionName, 100);\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\r\n throw new Error(`${optionName} はメールアドレス形式で指定してください`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingWpLogin(value: string, optionName: string, maximum: number, allowSpace = false): string {\r\n validateWphostingLength(value, optionName, maximum);\r\n const pattern = allowSpace ? /^[0-9A-Za-z _\\-.@]+$/ : /^[0-9A-Za-z_\\-.@]+$/;\r\n if (!pattern.test(value)) {\r\n throw new Error(`${optionName} に使用できない文字が含まれています`);\r\n }\r\n return value;\r\n}\r\n\r\nexport function validateWphostingSitePassword(value: string, username: string): string {\r\n validateWphostingLength(value, '--wp-password', 64, 7);\r\n if (!/^[A-Za-z0-9!#$%=~^|:_\\[\\]().+\\-*\\/@&<>`;?,]+$/.test(value)\r\n || !/[A-Za-z]/.test(value)\r\n || !/[^A-Za-z]/.test(value)) {\r\n throw new Error('--wp-password は半角英字と数字または記号を含む許可文字で指定してください');\r\n }\r\n if (value === username) throw new Error('--wp-password は --wp-username と異なる文字列を指定してください');\r\n return value;\r\n}\r\n\r\nexport function requireWphostingFields(data: Record<string, unknown>, message = '更新項目を1つ以上指定してください'): void {\r\n if (Object.keys(data).length === 0) throw new Error(message);\r\n}\r\n","{\n \"name\": \"shincloud-cli\",\n \"version\": \"1.3.0\",\n \"description\": \"Official CLI for Shincloud API — manage your Shincloud hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"shincloud\": \"./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 \"shincloud\",\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: 'shincloud',\r\n apiBase: 'https://api.shin-server.jp',\r\n displayName: 'シンクラウド API',\r\n domainTermsUrl: 'https://www.shin-domain.jp/rule/rule.php',\r\n domainPrivacyUrl: 'https://www.shin-domain.jp/privacy_announcement.php',\r\n commandName: 'shincloud',\r\n configDir: 'shincloud-cli',\r\n}, pkg.version);\r\n"],"mappings":"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","names":["contractId","servername","path","client","record","servername","servername","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","client","buildUpdateData","client","client","client","client","client","client","UPDATE_OPTIONS","cliOptionToCamelCase","parseBooleanParam","buildUpdateData","client","client","client","client","client","record","randomUUID","DNS_TYPES","IDEMPOTENCY_KEY_PATTERN","randomUUID","record","dnsData"]}
|