@optima-chat/commerce-cli 1.6.0 → 1.7.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.
Files changed (29) hide show
  1. package/.claude/skills/commerce-product/SKILL.md +47 -17
  2. package/.claude/skills/commerce-storefront/SKILL.md +9 -4
  3. package/dist/api/rest/commerce.d.ts +69 -1
  4. package/dist/api/rest/commerce.d.ts.map +1 -1
  5. package/dist/api/rest/commerce.js +81 -2
  6. package/dist/api/rest/commerce.js.map +1 -1
  7. package/dist/commands/product/add-videos.d.ts +3 -0
  8. package/dist/commands/product/add-videos.d.ts.map +1 -0
  9. package/dist/commands/product/add-videos.js +141 -0
  10. package/dist/commands/product/add-videos.js.map +1 -0
  11. package/dist/commands/product/index.d.ts.map +1 -1
  12. package/dist/commands/product/index.js +8 -0
  13. package/dist/commands/product/index.js.map +1 -1
  14. package/dist/commands/product/remove-videos.d.ts +3 -0
  15. package/dist/commands/product/remove-videos.d.ts.map +1 -0
  16. package/dist/commands/product/remove-videos.js +108 -0
  17. package/dist/commands/product/remove-videos.js.map +1 -0
  18. package/dist/commands/product/reorder-videos.d.ts +3 -0
  19. package/dist/commands/product/reorder-videos.d.ts.map +1 -0
  20. package/dist/commands/product/reorder-videos.js +111 -0
  21. package/dist/commands/product/reorder-videos.js.map +1 -0
  22. package/dist/commands/product/video-status.d.ts +3 -0
  23. package/dist/commands/product/video-status.d.ts.map +1 -0
  24. package/dist/commands/product/video-status.js +186 -0
  25. package/dist/commands/product/video-status.js.map +1 -0
  26. package/dist/commands/variant/add-images.d.ts.map +1 -1
  27. package/dist/commands/variant/add-images.js +47 -8
  28. package/dist/commands/variant/add-images.js.map +1 -1
  29. package/package.json +1 -1
@@ -0,0 +1,141 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { commerceApi } from '../../api/rest/commerce.js';
4
+ import { handleError, createApiError, ValidationError } from '../../utils/error.js';
5
+ import { output } from '../../utils/output.js';
6
+ import { addEnhancedHelp } from '../../utils/helpText.js';
7
+ const cmd = new Command('add-videos')
8
+ .description('Add videos to product (URLs or media IDs)')
9
+ .option('--id <uuid>', 'Product ID (required)')
10
+ .option('--url <urls...>', 'Video URLs (multiple allowed)')
11
+ .option('--media-id <ids...>', 'Media IDs from upload command (multiple allowed)')
12
+ .action(async (options) => {
13
+ try {
14
+ await addVideos(options);
15
+ }
16
+ catch (error) {
17
+ handleError(error);
18
+ }
19
+ });
20
+ addEnhancedHelp(cmd, {
21
+ examples: [
22
+ '# Method 1: Use video URLs (RECOMMENDED)',
23
+ '$ commerce product add-videos \\',
24
+ ' --id prod-123 \\',
25
+ ' --url "https://example.com/demo.mp4"',
26
+ '',
27
+ '# Method 2: Use media IDs',
28
+ '$ commerce upload video --path ./demo.mp4',
29
+ '# Copy media_id from response',
30
+ '$ commerce product add-videos \\',
31
+ ' --id prod-123 \\',
32
+ ' --media-id media_456 media_789',
33
+ ],
34
+ output: {
35
+ example: JSON.stringify({
36
+ success: true,
37
+ data: {
38
+ product_id: 'uuid',
39
+ videos: [
40
+ { media_id: 'xxx', position: 1, variants: { '720p': { url: '...' } } }
41
+ ],
42
+ count: 1
43
+ }
44
+ }, null, 2)
45
+ },
46
+ relatedCommands: [
47
+ { command: 'upload video', description: 'Upload video first to get media ID' },
48
+ { command: 'product video-status', description: 'Check video processing status' },
49
+ { command: 'product reorder-videos', description: 'Reorder product videos' },
50
+ { command: 'product remove-videos', description: 'Remove videos from product' },
51
+ ],
52
+ notes: [
53
+ 'Product ID is required',
54
+ 'Provide either --url or --media-id',
55
+ 'Videos are processed asynchronously (transcoding to 480p/720p/1080p)',
56
+ 'Supported formats: MP4, WebM, MOV',
57
+ 'Maximum file size: 500MB per video',
58
+ ]
59
+ });
60
+ export const addVideosCommand = cmd;
61
+ async function addVideos(options) {
62
+ if (!options.id || options.id.trim().length === 0) {
63
+ throw new ValidationError('商品 ID 不能为空', 'id');
64
+ }
65
+ const productId = options.id;
66
+ const { url: videoUrls = [], mediaId: mediaIds = [] } = options;
67
+ if (videoUrls.length === 0 && mediaIds.length === 0) {
68
+ throw new ValidationError('请至少提供一个视频(--url 或 --media-id)', 'videos');
69
+ }
70
+ console.log(chalk.cyan('\n🎬 添加商品视频...\n'));
71
+ // 1. 如果有 Media IDs,直接关联
72
+ if (mediaIds.length > 0) {
73
+ console.log(chalk.green(`✓ Media IDs: ${mediaIds.length} 个`));
74
+ console.log();
75
+ const spinner = output.spinner(`正在关联 ${mediaIds.length} 个视频...`);
76
+ try {
77
+ const result = await commerceApi.products.addVideosByMediaIds(productId, mediaIds);
78
+ spinner.succeed(`视频关联成功!(${mediaIds.length} 个)`);
79
+ if (output.isJson()) {
80
+ output.success({
81
+ product_id: productId,
82
+ videos: result.videos || [],
83
+ count: (result.videos || []).length
84
+ });
85
+ }
86
+ else {
87
+ console.log();
88
+ if (result.videos && result.videos.length > 0) {
89
+ console.log(chalk.gray('已关联的视频:'));
90
+ result.videos.forEach((video, index) => {
91
+ console.log(chalk.gray(` ${index + 1}. `) + chalk.cyan(video.media_id || video));
92
+ });
93
+ }
94
+ console.log();
95
+ console.log(chalk.yellow('⚠️ 视频转码处理中,使用 commerce product video-status 查看状态'));
96
+ console.log();
97
+ }
98
+ return;
99
+ }
100
+ catch (error) {
101
+ spinner.fail('视频关联失败');
102
+ throw createApiError(error);
103
+ }
104
+ }
105
+ // 2. 如果有 URL,使用 video_urls API
106
+ if (videoUrls.length > 0) {
107
+ for (const url of videoUrls) {
108
+ console.log(chalk.green(`✓ URL: ${url}`));
109
+ }
110
+ console.log();
111
+ const spinner = output.spinner(`正在添加 ${videoUrls.length} 个视频...`);
112
+ try {
113
+ const result = await commerceApi.products.addVideoUrls(productId, videoUrls);
114
+ spinner.succeed(`视频添加成功!(${videoUrls.length} 个)`);
115
+ if (output.isJson()) {
116
+ output.success({
117
+ product_id: productId,
118
+ videos: result.videos || [],
119
+ count: (result.videos || []).length
120
+ });
121
+ }
122
+ else {
123
+ console.log();
124
+ if (result.videos && result.videos.length > 0) {
125
+ console.log(chalk.gray('已添加的视频:'));
126
+ result.videos.forEach((video, index) => {
127
+ console.log(chalk.gray(` ${index + 1}. `) + chalk.cyan(video.media_id || video));
128
+ });
129
+ }
130
+ console.log();
131
+ console.log(chalk.yellow('⚠️ 视频转码处理中,使用 commerce product video-status 查看状态'));
132
+ console.log();
133
+ }
134
+ }
135
+ catch (error) {
136
+ spinner.fail('视频添加失败');
137
+ throw createApiError(error);
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=add-videos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-videos.js","sourceRoot":"","sources":["../../../src/commands/product/add-videos.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,cAAc,SAQF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAYF,CAAC"}
@@ -5,6 +5,10 @@ import { getProductCommand } from './get.js';
5
5
  import { updateProductCommand } from './update.js';
6
6
  import { deleteProductCommand } from './delete.js';
7
7
  import { addImagesCommand } from './add-images.js';
8
+ import { addVideosCommand } from './add-videos.js';
9
+ import { removeVideosCommand } from './remove-videos.js';
10
+ import { reorderVideosCommand } from './reorder-videos.js';
11
+ import { videoStatusCommand } from './video-status.js';
8
12
  import { urlCommand } from './url.js';
9
13
  export const productCommand = new Command('product')
10
14
  .description('商品管理')
@@ -14,5 +18,9 @@ export const productCommand = new Command('product')
14
18
  .addCommand(updateProductCommand)
15
19
  .addCommand(deleteProductCommand)
16
20
  .addCommand(addImagesCommand)
21
+ .addCommand(addVideosCommand)
22
+ .addCommand(removeVideosCommand)
23
+ .addCommand(reorderVideosCommand)
24
+ .addCommand(videoStatusCommand)
17
25
  .addCommand(urlCommand);
18
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,kBAAkB,CAAC;KAC9B,UAAU,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const removeVideosCommand: Command;
3
+ //# sourceMappingURL=remove-videos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-videos.d.ts","sourceRoot":"","sources":["../../../src/commands/product/remove-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,mBAAmB,SAAM,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { commerceApi } from '../../api/rest/commerce.js';
5
+ import { handleError, createApiError, ValidationError } from '../../utils/error.js';
6
+ import { output } from '../../utils/output.js';
7
+ import { addEnhancedHelp } from '../../utils/helpText.js';
8
+ import { isInteractiveEnvironment } from '../../utils/interactive.js';
9
+ const cmd = new Command('remove-videos')
10
+ .description('Remove videos from product')
11
+ .option('--id <uuid>', 'Product ID (required)')
12
+ .option('--media-id <ids...>', 'Media IDs to remove (multiple allowed)')
13
+ .option('--yes', 'Skip confirmation prompt')
14
+ .action(async (options) => {
15
+ try {
16
+ await removeVideos(options);
17
+ }
18
+ catch (error) {
19
+ handleError(error);
20
+ }
21
+ });
22
+ addEnhancedHelp(cmd, {
23
+ examples: [
24
+ '# Remove specific videos',
25
+ '$ commerce product remove-videos \\',
26
+ ' --id prod-123 \\',
27
+ ' --media-id media_456 media_789',
28
+ '',
29
+ '# Skip confirmation',
30
+ '$ commerce product remove-videos \\',
31
+ ' --id prod-123 \\',
32
+ ' --media-id media_456 --yes',
33
+ ],
34
+ output: {
35
+ example: JSON.stringify({
36
+ success: true,
37
+ data: {
38
+ product_id: 'uuid',
39
+ removed_count: 2,
40
+ remaining_videos: []
41
+ }
42
+ }, null, 2)
43
+ },
44
+ relatedCommands: [
45
+ { command: 'product get', description: 'View product videos and media IDs' },
46
+ { command: 'product add-videos', description: 'Add videos to product' },
47
+ ],
48
+ notes: [
49
+ 'Product ID and media IDs are required',
50
+ 'Use product get to find video media IDs',
51
+ 'This only removes the association, not the media file',
52
+ ]
53
+ });
54
+ export const removeVideosCommand = cmd;
55
+ async function removeVideos(options) {
56
+ if (!options.id || options.id.trim().length === 0) {
57
+ throw new ValidationError('商品 ID 不能为空', 'id');
58
+ }
59
+ const { mediaId: mediaIds = [] } = options;
60
+ if (mediaIds.length === 0) {
61
+ throw new ValidationError('请提供要移除的视频 Media ID(--media-id)', 'media_id');
62
+ }
63
+ const productId = options.id;
64
+ console.log(chalk.cyan('\n🎬 移除商品视频\n'));
65
+ console.log(chalk.gray('商品 ID: ') + chalk.white(productId));
66
+ console.log(chalk.gray('要移除的视频: ') + chalk.white(mediaIds.join(', ')));
67
+ console.log();
68
+ // 确认
69
+ if (!options.yes && isInteractiveEnvironment()) {
70
+ const { confirm } = await inquirer.prompt([
71
+ {
72
+ type: 'confirm',
73
+ name: 'confirm',
74
+ message: `确定要移除 ${mediaIds.length} 个视频吗?`,
75
+ default: false,
76
+ },
77
+ ]);
78
+ if (!confirm) {
79
+ console.log(chalk.yellow('已取消操作'));
80
+ return;
81
+ }
82
+ }
83
+ const spinner = output.spinner(`正在移除 ${mediaIds.length} 个视频...`);
84
+ try {
85
+ const result = await commerceApi.products.removeVideos(productId, mediaIds);
86
+ spinner.succeed(`视频移除成功!`);
87
+ if (output.isJson()) {
88
+ output.success({
89
+ product_id: productId,
90
+ removed_count: mediaIds.length,
91
+ remaining_videos: result.videos || []
92
+ });
93
+ }
94
+ else {
95
+ console.log();
96
+ console.log(chalk.green(`✓ 已移除 ${mediaIds.length} 个视频`));
97
+ if (result.videos && result.videos.length > 0) {
98
+ console.log(chalk.gray(`剩余视频: ${result.videos.length} 个`));
99
+ }
100
+ console.log();
101
+ }
102
+ }
103
+ catch (error) {
104
+ spinner.fail('视频移除失败');
105
+ throw createApiError(error);
106
+ }
107
+ }
108
+ //# sourceMappingURL=remove-videos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-videos.js","sourceRoot":"","sources":["../../../src/commands/product/remove-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KACrC,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,OAA2D,EAAE,EAAE;IAC5E,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe,CAAC,GAAG,EAAE;IACnB,QAAQ,EAAE;QACR,0BAA0B;QAC1B,qCAAqC;QACrC,oBAAoB;QACpB,kCAAkC;QAClC,EAAE;QACF,qBAAqB;QACrB,qCAAqC;QACrC,oBAAoB;QACpB,8BAA8B;KAC/B;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,UAAU,EAAE,MAAM;gBAClB,aAAa,EAAE,CAAC;gBAChB,gBAAgB,EAAE,EAAE;aACrB;SACF,EAAE,IAAI,EAAE,CAAC,CAAC;KACZ;IACD,eAAe,EAAE;QACf,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mCAAmC,EAAE;QAC5E,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,uBAAuB,EAAE;KACxE;IACD,KAAK,EAAE;QACL,uCAAuC;QACvC,yCAAyC;QACzC,uDAAuD;KACxD;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC,KAAK,UAAU,YAAY,CAAC,OAA2D;IACrF,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK;IACL,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,SAAS,QAAQ,CAAC,MAAM,QAAQ;gBACzC,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5E,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC;gBACb,UAAU,EAAE,SAAS;gBACrB,aAAa,EAAE,QAAQ,CAAC,MAAM;gBAC9B,gBAAgB,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const reorderVideosCommand: Command;
3
+ //# sourceMappingURL=reorder-videos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder-videos.d.ts","sourceRoot":"","sources":["../../../src/commands/product/reorder-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,oBAAoB,SAAM,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { commerceApi } from '../../api/rest/commerce.js';
4
+ import { handleError, createApiError, ValidationError } from '../../utils/error.js';
5
+ import { output } from '../../utils/output.js';
6
+ import { addEnhancedHelp } from '../../utils/helpText.js';
7
+ const cmd = new Command('reorder-videos')
8
+ .description('Reorder product videos')
9
+ .option('--id <uuid>', 'Product ID (required)')
10
+ .option('--moves <json>', 'Reorder moves as JSON: [{"media_id":"xxx","new_position":1}]')
11
+ .action(async (options) => {
12
+ try {
13
+ await reorderVideos(options);
14
+ }
15
+ catch (error) {
16
+ handleError(error);
17
+ }
18
+ });
19
+ addEnhancedHelp(cmd, {
20
+ examples: [
21
+ '# Move video to position 1 (first)',
22
+ '$ commerce product reorder-videos \\',
23
+ ' --id prod-123 \\',
24
+ ' --moves \'[{"media_id":"media_456","new_position":1}]\'',
25
+ '',
26
+ '# Swap multiple videos',
27
+ '$ commerce product reorder-videos \\',
28
+ ' --id prod-123 \\',
29
+ ' --moves \'[{"media_id":"media_a","new_position":2},{"media_id":"media_b","new_position":1}]\'',
30
+ ],
31
+ output: {
32
+ example: JSON.stringify({
33
+ success: true,
34
+ data: {
35
+ updated_count: 2,
36
+ videos: [
37
+ { media_id: 'media_b', position: 1 },
38
+ { media_id: 'media_a', position: 2 }
39
+ ]
40
+ }
41
+ }, null, 2)
42
+ },
43
+ relatedCommands: [
44
+ { command: 'product get', description: 'View current video order' },
45
+ { command: 'product add-videos', description: 'Add videos to product' },
46
+ ],
47
+ notes: [
48
+ 'Product ID and moves are required',
49
+ 'Position uses 1-based indexing (1 = first video)',
50
+ 'Other videos automatically shift positions',
51
+ 'Use product get to find video media IDs',
52
+ ]
53
+ });
54
+ export const reorderVideosCommand = cmd;
55
+ async function reorderVideos(options) {
56
+ if (!options.id || options.id.trim().length === 0) {
57
+ throw new ValidationError('商品 ID 不能为空', 'id');
58
+ }
59
+ if (!options.moves) {
60
+ throw new ValidationError('请提供重排操作(--moves)', 'moves');
61
+ }
62
+ const productId = options.id;
63
+ // 解析 moves JSON
64
+ let moves;
65
+ try {
66
+ moves = JSON.parse(options.moves);
67
+ if (!Array.isArray(moves)) {
68
+ throw new Error('moves 必须是数组');
69
+ }
70
+ for (const move of moves) {
71
+ if (!move.media_id || typeof move.new_position !== 'number') {
72
+ throw new Error('每个 move 必须包含 media_id 和 new_position');
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ throw new ValidationError(`无效的 moves JSON: ${error.message}`, 'moves');
78
+ }
79
+ console.log(chalk.cyan('\n🎬 重排商品视频\n'));
80
+ console.log(chalk.gray('商品 ID: ') + chalk.white(productId));
81
+ console.log(chalk.gray('操作:'));
82
+ for (const move of moves) {
83
+ console.log(chalk.gray(` • `) + chalk.white(`${move.media_id} → 位置 ${move.new_position}`));
84
+ }
85
+ console.log();
86
+ const spinner = output.spinner('正在重排视频...');
87
+ try {
88
+ const result = await commerceApi.products.reorderVideos(productId, moves);
89
+ spinner.succeed('视频重排成功!');
90
+ if (output.isJson()) {
91
+ output.success(result);
92
+ }
93
+ else {
94
+ console.log();
95
+ console.log(chalk.green(`✓ 更新了 ${result.updated_count || moves.length} 个视频位置`));
96
+ if (result.videos && result.videos.length > 0) {
97
+ console.log();
98
+ console.log(chalk.gray('当前顺序:'));
99
+ result.videos.forEach((video) => {
100
+ console.log(chalk.gray(` ${video.position}. `) + chalk.cyan(video.media_id));
101
+ });
102
+ }
103
+ console.log();
104
+ }
105
+ }
106
+ catch (error) {
107
+ spinner.fail('视频重排失败');
108
+ throw createApiError(error);
109
+ }
110
+ }
111
+ //# sourceMappingURL=reorder-videos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reorder-videos.js","sourceRoot":"","sources":["../../../src/commands/product/reorder-videos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const videoStatusCommand: Command;
3
+ //# sourceMappingURL=video-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-status.d.ts","sourceRoot":"","sources":["../../../src/commands/product/video-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,kBAAkB,SAAM,CAAC"}
@@ -0,0 +1,186 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { commerceApi } from '../../api/rest/commerce.js';
4
+ import { handleError, createApiError, ValidationError } from '../../utils/error.js';
5
+ import { output } from '../../utils/output.js';
6
+ import { addEnhancedHelp } from '../../utils/helpText.js';
7
+ const cmd = new Command('video-status')
8
+ .description('Check video processing status')
9
+ .option('--media-id <id>', 'Media ID of the video (required)')
10
+ .option('--wait', 'Wait for processing to complete (polls every 3 seconds)')
11
+ .action(async (options) => {
12
+ try {
13
+ await checkVideoStatus(options);
14
+ }
15
+ catch (error) {
16
+ handleError(error);
17
+ }
18
+ });
19
+ addEnhancedHelp(cmd, {
20
+ examples: [
21
+ '# Check video status',
22
+ '$ commerce product video-status --media-id media_456',
23
+ '',
24
+ '# Wait for processing to complete',
25
+ '$ commerce product video-status --media-id media_456 --wait',
26
+ ],
27
+ output: {
28
+ example: JSON.stringify({
29
+ success: true,
30
+ data: {
31
+ media_id: 'media_456',
32
+ status: 'completed',
33
+ progress: 100,
34
+ variants: {
35
+ '480p': { url: 'https://...', size: 12345 },
36
+ '720p': { url: 'https://...', size: 23456 },
37
+ '1080p': { url: 'https://...', size: 45678 },
38
+ 'thumbnail': { url: 'https://...' }
39
+ }
40
+ }
41
+ }, null, 2)
42
+ },
43
+ relatedCommands: [
44
+ { command: 'product add-videos', description: 'Add videos to product' },
45
+ { command: 'upload video', description: 'Upload video to get media ID' },
46
+ ],
47
+ notes: [
48
+ 'Status values: pending, processing, completed, failed',
49
+ 'Videos are transcoded to 480p, 720p, 1080p + thumbnail',
50
+ 'Use --wait to automatically poll until complete',
51
+ 'Processing usually takes 1-5 minutes depending on file size',
52
+ ]
53
+ });
54
+ export const videoStatusCommand = cmd;
55
+ async function checkVideoStatus(options) {
56
+ if (!options.mediaId || options.mediaId.trim().length === 0) {
57
+ throw new ValidationError('Media ID 不能为空', 'media_id');
58
+ }
59
+ const mediaId = options.mediaId;
60
+ if (options.wait) {
61
+ await waitForVideoProcessing(mediaId);
62
+ }
63
+ else {
64
+ await getVideoStatus(mediaId);
65
+ }
66
+ }
67
+ async function getVideoStatus(mediaId) {
68
+ const spinner = output.spinner('正在查询视频状态...');
69
+ try {
70
+ const result = await commerceApi.media.getVideoStatus(mediaId);
71
+ spinner.stop();
72
+ if (output.isJson()) {
73
+ output.success(result);
74
+ }
75
+ else {
76
+ console.log();
77
+ console.log(chalk.cyan('🎬 视频处理状态'));
78
+ console.log();
79
+ console.log(chalk.gray('Media ID: ') + chalk.white(mediaId));
80
+ console.log(chalk.gray('状态: ') + formatStatus(result.status));
81
+ if (result.progress !== undefined && result.progress !== null) {
82
+ console.log(chalk.gray('进度: ') + chalk.white(`${result.progress}%`));
83
+ }
84
+ if (result.error) {
85
+ console.log(chalk.gray('错误: ') + chalk.red(result.error));
86
+ }
87
+ if (result.variants && Object.keys(result.variants).length > 0) {
88
+ console.log();
89
+ console.log(chalk.gray('转码版本:'));
90
+ for (const [resolution, info] of Object.entries(result.variants)) {
91
+ const variantInfo = info;
92
+ const size = variantInfo.size ? ` (${formatBytes(variantInfo.size)})` : '';
93
+ console.log(chalk.gray(` • ${resolution}:`) + chalk.cyan(` ${variantInfo.url || '处理中...'}${size}`));
94
+ }
95
+ }
96
+ console.log();
97
+ }
98
+ }
99
+ catch (error) {
100
+ spinner.fail('查询失败');
101
+ throw createApiError(error);
102
+ }
103
+ }
104
+ async function waitForVideoProcessing(mediaId) {
105
+ console.log(chalk.cyan('\n🎬 等待视频处理完成...\n'));
106
+ console.log(chalk.gray('Media ID: ') + chalk.white(mediaId));
107
+ console.log();
108
+ const maxAttempts = 120; // 最多等待 6 分钟(120 * 3秒)
109
+ let attempts = 0;
110
+ while (attempts < maxAttempts) {
111
+ try {
112
+ const result = await commerceApi.media.getVideoStatus(mediaId);
113
+ // 清除上一行并显示当前状态
114
+ process.stdout.write(`\r${chalk.gray('状态:')} ${formatStatus(result.status)}`);
115
+ if (result.progress !== undefined && result.progress !== null) {
116
+ process.stdout.write(chalk.gray(` | 进度: `) + chalk.white(`${result.progress}%`));
117
+ }
118
+ process.stdout.write(' '); // 清除可能的残留字符
119
+ if (result.status === 'completed') {
120
+ console.log('\n');
121
+ console.log(chalk.green('✓ 视频处理完成!'));
122
+ if (result.variants && Object.keys(result.variants).length > 0) {
123
+ console.log();
124
+ console.log(chalk.gray('可用版本:'));
125
+ for (const [resolution, info] of Object.entries(result.variants)) {
126
+ const variantInfo = info;
127
+ const size = variantInfo.size ? ` (${formatBytes(variantInfo.size)})` : '';
128
+ console.log(chalk.gray(` • ${resolution}:`));
129
+ console.log(chalk.cyan(` ${variantInfo.url}${size}`));
130
+ }
131
+ }
132
+ console.log();
133
+ if (output.isJson()) {
134
+ output.success(result);
135
+ }
136
+ return;
137
+ }
138
+ if (result.status === 'failed') {
139
+ console.log('\n');
140
+ console.log(chalk.red('✗ 视频处理失败'));
141
+ if (result.error) {
142
+ console.log(chalk.gray('错误: ') + chalk.red(result.error));
143
+ }
144
+ console.log();
145
+ process.exit(1);
146
+ }
147
+ // 等待 3 秒后重试
148
+ await sleep(3000);
149
+ attempts++;
150
+ }
151
+ catch (error) {
152
+ console.log('\n');
153
+ throw createApiError(error);
154
+ }
155
+ }
156
+ console.log('\n');
157
+ console.log(chalk.yellow('⚠️ 等待超时,视频仍在处理中'));
158
+ console.log(chalk.gray('请稍后使用 commerce product video-status --media-id ' + mediaId + ' 再次查询'));
159
+ console.log();
160
+ }
161
+ function formatStatus(status) {
162
+ switch (status) {
163
+ case 'pending':
164
+ return chalk.yellow('等待处理');
165
+ case 'processing':
166
+ return chalk.blue('处理中');
167
+ case 'completed':
168
+ return chalk.green('已完成');
169
+ case 'failed':
170
+ return chalk.red('失败');
171
+ default:
172
+ return chalk.gray(status);
173
+ }
174
+ }
175
+ function formatBytes(bytes) {
176
+ if (bytes === 0)
177
+ return '0 B';
178
+ const k = 1024;
179
+ const sizes = ['B', 'KB', 'MB', 'GB'];
180
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
181
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
182
+ }
183
+ function sleep(ms) {
184
+ return new Promise(resolve => setTimeout(resolve, ms));
185
+ }
186
+ //# sourceMappingURL=video-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-status.js","sourceRoot":"","sources":["../../../src/commands/product/video-status.ts"],"names":[],"mappings":"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"}