@optima-chat/commerce-cli 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/rest/auth.d.ts +0 -4
- package/dist/api/rest/auth.d.ts.map +1 -1
- package/dist/api/rest/auth.js +1 -17
- package/dist/api/rest/auth.js.map +1 -1
- package/dist/api/rest/base.d.ts +1 -1
- package/dist/api/rest/base.js +4 -4
- package/dist/api/rest/base.js.map +1 -1
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/commands/auth/index.js +1 -5
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +61 -15
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.d.ts.map +1 -1
- package/dist/commands/auth/logout.js +10 -56
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/whoami.d.ts.map +1 -1
- package/dist/commands/auth/whoami.js +34 -26
- package/dist/commands/auth/whoami.js.map +1 -1
- package/dist/utils/config.d.ts +13 -45
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +128 -214
- package/dist/utils/config.js.map +1 -1
- package/package.json +1 -2
- package/dist/commands/auth/switch.d.ts +0 -3
- package/dist/commands/auth/switch.d.ts.map +0 -1
- package/dist/commands/auth/switch.js +0 -111
- package/dist/commands/auth/switch.js.map +0 -1
- package/dist/commands/auth/test-refresh.d.ts +0 -3
- package/dist/commands/auth/test-refresh.d.ts.map +0 -1
- package/dist/commands/auth/test-refresh.js +0 -43
- package/dist/commands/auth/test-refresh.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optima-chat/commerce-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "用自然语言管理电商店铺 - 专为 Claude Code 设计的对话式 CLI 工具,支持多环境和功能测试",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -54,7 +54,6 @@
|
|
|
54
54
|
"chalk": "^5.3.0",
|
|
55
55
|
"cli-table3": "^0.6.5",
|
|
56
56
|
"commander": "^12.0.0",
|
|
57
|
-
"conf": "^12.0.0",
|
|
58
57
|
"dayjs": "^1.11.18",
|
|
59
58
|
"form-data": "^4.0.4",
|
|
60
59
|
"inquirer": "^9.2.14",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiIpC,eAAO,MAAM,aAAa,SAAM,CAAC"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { setCurrentEnvironment, isAuthenticated, getUser, getCurrentEnvironment, ENV_CONFIG } from '../../utils/config.js';
|
|
4
|
-
import { authApi } from '../../api/rest/auth.js';
|
|
5
|
-
import { commerceApi } from '../../api/rest/commerce.js';
|
|
6
|
-
import { output } from '../../utils/output.js';
|
|
7
|
-
import { addEnhancedHelp } from '../../utils/helpText.js';
|
|
8
|
-
const cmd = new Command('switch')
|
|
9
|
-
.description('Switch to a different environment')
|
|
10
|
-
.requiredOption('--env <environment>', 'Target environment: production, stage, or development')
|
|
11
|
-
.action(async (options) => {
|
|
12
|
-
try {
|
|
13
|
-
// 验证环境参数
|
|
14
|
-
const validEnvironments = ['production', 'stage', 'development'];
|
|
15
|
-
if (!validEnvironments.includes(options.env)) {
|
|
16
|
-
console.log(chalk.red(`\n❌ 无效的环境: ${options.env}`));
|
|
17
|
-
console.log(chalk.gray(' 支持的环境: production, stage, development\n'));
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const currentEnv = getCurrentEnvironment();
|
|
21
|
-
// 检查是否已经是目标环境
|
|
22
|
-
if (currentEnv === options.env) {
|
|
23
|
-
console.log(chalk.yellow(`\n⚠️ 已经在 ${options.env} 环境\n`));
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
// 切换环境
|
|
27
|
-
setCurrentEnvironment(options.env);
|
|
28
|
-
// 重新初始化 API 客户端
|
|
29
|
-
authApi.reinitialize();
|
|
30
|
-
commerceApi.reinitialize();
|
|
31
|
-
const envConfig = ENV_CONFIG[options.env];
|
|
32
|
-
// 检查目标环境是否已登录
|
|
33
|
-
const isLoggedIn = isAuthenticated();
|
|
34
|
-
const user = isLoggedIn ? getUser() : null;
|
|
35
|
-
if (output.isJson()) {
|
|
36
|
-
output.success({
|
|
37
|
-
switched: true,
|
|
38
|
-
from: currentEnv,
|
|
39
|
-
to: options.env,
|
|
40
|
-
logged_in: isLoggedIn,
|
|
41
|
-
user: user ? { email: user.email, name: user.name } : null,
|
|
42
|
-
auth_url: envConfig.authUrl,
|
|
43
|
-
api_url: envConfig.apiUrl
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
console.log(chalk.green(`\n✓ 已切换到 ${options.env} 环境\n`));
|
|
48
|
-
console.log(chalk.white('环境信息:'));
|
|
49
|
-
console.log(chalk.gray(` Auth URL: ${envConfig.authUrl}`));
|
|
50
|
-
console.log(chalk.gray(` API URL: ${envConfig.apiUrl}`));
|
|
51
|
-
console.log(chalk.gray(` 店铺域名: ${envConfig.storeDomain}`));
|
|
52
|
-
if (isLoggedIn && user) {
|
|
53
|
-
console.log(chalk.white('\n登录状态:'));
|
|
54
|
-
console.log(chalk.green(` ✓ 已登录`));
|
|
55
|
-
console.log(chalk.gray(` 账号: ${user.email}`));
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
console.log(chalk.white('\n登录状态:'));
|
|
59
|
-
console.log(chalk.yellow(` ⚠️ 未登录`));
|
|
60
|
-
console.log(chalk.gray(' 使用 ') + chalk.cyan(`commerce auth login --env ${options.env}`) + chalk.gray(' 登录'));
|
|
61
|
-
}
|
|
62
|
-
console.log('');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
console.log(chalk.red(`\n❌ 切换环境失败: ${error.message}\n`));
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
addEnhancedHelp(cmd, {
|
|
70
|
-
examples: [
|
|
71
|
-
'# Switch to stage environment',
|
|
72
|
-
'$ commerce auth switch --env stage',
|
|
73
|
-
'',
|
|
74
|
-
'# Switch to development environment',
|
|
75
|
-
'$ commerce auth switch --env development',
|
|
76
|
-
'',
|
|
77
|
-
'# Switch back to production',
|
|
78
|
-
'$ commerce auth switch --env production',
|
|
79
|
-
],
|
|
80
|
-
output: {
|
|
81
|
-
example: JSON.stringify({
|
|
82
|
-
success: true,
|
|
83
|
-
data: {
|
|
84
|
-
switched: true,
|
|
85
|
-
from: 'production',
|
|
86
|
-
to: 'stage',
|
|
87
|
-
logged_in: true,
|
|
88
|
-
user: {
|
|
89
|
-
email: 'user@example.com',
|
|
90
|
-
name: 'User Name'
|
|
91
|
-
},
|
|
92
|
-
auth_url: 'https://auth-stage.optima.shop',
|
|
93
|
-
api_url: 'https://api-stage.optima.shop'
|
|
94
|
-
}
|
|
95
|
-
}, null, 2)
|
|
96
|
-
},
|
|
97
|
-
relatedCommands: [
|
|
98
|
-
{ command: 'auth whoami', description: 'Check current environment and login status' },
|
|
99
|
-
{ command: 'auth login', description: 'Login to an environment' },
|
|
100
|
-
{ command: 'auth logout', description: 'Logout from current or specific environment' },
|
|
101
|
-
],
|
|
102
|
-
notes: [
|
|
103
|
-
'Switches the active environment without requiring re-login',
|
|
104
|
-
'Each environment maintains separate credentials',
|
|
105
|
-
'API clients are automatically reinitialized to use the new environment URLs',
|
|
106
|
-
'Use "auth whoami" to verify current environment after switching',
|
|
107
|
-
'If not logged in to target environment, you will need to run "auth login"',
|
|
108
|
-
]
|
|
109
|
-
});
|
|
110
|
-
export const switchCommand = cmd;
|
|
111
|
-
//# sourceMappingURL=switch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/commands/auth/switch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-refresh.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/test-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,kBAAkB,SA0C3B,CAAC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { isAuthenticated, getTokenExpiresAt, isTokenExpired, ensureValidToken, saveTokens, getRefreshToken } from '../../utils/config.js';
|
|
4
|
-
export const testRefreshCommand = new Command('test-refresh')
|
|
5
|
-
.description('测试 Token 自动刷新功能')
|
|
6
|
-
.action(async () => {
|
|
7
|
-
try {
|
|
8
|
-
if (!isAuthenticated()) {
|
|
9
|
-
console.log(chalk.yellow('\n⚠️ 未登录\n'));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const expiresAt = getTokenExpiresAt();
|
|
13
|
-
const now = Date.now();
|
|
14
|
-
const isExpired = isTokenExpired();
|
|
15
|
-
console.log(chalk.cyan('\n📋 Token 状态\n'));
|
|
16
|
-
console.log(chalk.white('过期时间: ') + chalk.gray(new Date(expiresAt).toLocaleString()));
|
|
17
|
-
console.log(chalk.white('当前时间: ') + chalk.gray(new Date(now).toLocaleString()));
|
|
18
|
-
console.log(chalk.white('剩余时间: ') + chalk.gray(`${Math.floor((expiresAt - now) / 1000)} 秒`));
|
|
19
|
-
console.log(chalk.white('是否过期: ') + (isExpired ? chalk.red('是') : chalk.green('否')));
|
|
20
|
-
// 强制让 token 过期(用于测试)
|
|
21
|
-
console.log(chalk.yellow('\n⚠️ 强制让 token 过期(用于测试刷新功能)...\n'));
|
|
22
|
-
const refreshToken = getRefreshToken();
|
|
23
|
-
if (refreshToken) {
|
|
24
|
-
saveTokens('expired-token', refreshToken, -100); // 设置为已过期
|
|
25
|
-
}
|
|
26
|
-
console.log(chalk.cyan('🔄 尝试获取有效 token(应该自动刷新)...\n'));
|
|
27
|
-
const token = await ensureValidToken();
|
|
28
|
-
if (token) {
|
|
29
|
-
const newExpiresAt = getTokenExpiresAt();
|
|
30
|
-
console.log(chalk.green('✓ Token 刷新成功!\n'));
|
|
31
|
-
console.log(chalk.white('新 Token: ') + chalk.gray(token.substring(0, 20) + '...'));
|
|
32
|
-
console.log(chalk.white('新过期时间: ') + chalk.gray(new Date(newExpiresAt).toLocaleString()));
|
|
33
|
-
console.log(chalk.white('剩余时间: ') + chalk.gray(`${Math.floor((newExpiresAt - Date.now()) / 1000)} 秒\n`));
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
console.log(chalk.red('❌ Token 刷新失败\n'));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
console.log(chalk.red(`\n❌ 测试失败: ${error.message}\n`));
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=test-refresh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-refresh.js","sourceRoot":"","sources":["../../../src/commands/auth/test-refresh.ts"],"names":[],"mappings":"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"}
|