@optima-chat/commerce-cli 1.8.1 → 1.9.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 (64) hide show
  1. package/.claude/skills/commerce-review/SKILL.md +196 -0
  2. package/dist/api/rest/commerce.d.ts +117 -1
  3. package/dist/api/rest/commerce.d.ts.map +1 -1
  4. package/dist/api/rest/commerce.js +76 -0
  5. package/dist/api/rest/commerce.js.map +1 -1
  6. package/dist/commands/review/approve.d.ts +3 -0
  7. package/dist/commands/review/approve.d.ts.map +1 -0
  8. package/dist/commands/review/approve.js +73 -0
  9. package/dist/commands/review/approve.js.map +1 -0
  10. package/dist/commands/review/batch.d.ts +3 -0
  11. package/dist/commands/review/batch.d.ts.map +1 -0
  12. package/dist/commands/review/batch.js +120 -0
  13. package/dist/commands/review/batch.js.map +1 -0
  14. package/dist/commands/review/delete-response.d.ts +3 -0
  15. package/dist/commands/review/delete-response.d.ts.map +1 -0
  16. package/dist/commands/review/delete-response.js +91 -0
  17. package/dist/commands/review/delete-response.js.map +1 -0
  18. package/dist/commands/review/delete.d.ts +3 -0
  19. package/dist/commands/review/delete.d.ts.map +1 -0
  20. package/dist/commands/review/delete.js +93 -0
  21. package/dist/commands/review/delete.js.map +1 -0
  22. package/dist/commands/review/feature.d.ts +3 -0
  23. package/dist/commands/review/feature.d.ts.map +1 -0
  24. package/dist/commands/review/feature.js +89 -0
  25. package/dist/commands/review/feature.js.map +1 -0
  26. package/dist/commands/review/get.d.ts +3 -0
  27. package/dist/commands/review/get.d.ts.map +1 -0
  28. package/dist/commands/review/get.js +79 -0
  29. package/dist/commands/review/get.js.map +1 -0
  30. package/dist/commands/review/handle-report.d.ts +3 -0
  31. package/dist/commands/review/handle-report.d.ts.map +1 -0
  32. package/dist/commands/review/handle-report.js +85 -0
  33. package/dist/commands/review/handle-report.js.map +1 -0
  34. package/dist/commands/review/index.d.ts +3 -0
  35. package/dist/commands/review/index.d.ts.map +1 -0
  36. package/dist/commands/review/index.js +28 -0
  37. package/dist/commands/review/index.js.map +1 -0
  38. package/dist/commands/review/list.d.ts +3 -0
  39. package/dist/commands/review/list.d.ts.map +1 -0
  40. package/dist/commands/review/list.js +144 -0
  41. package/dist/commands/review/list.js.map +1 -0
  42. package/dist/commands/review/reject.d.ts +3 -0
  43. package/dist/commands/review/reject.d.ts.map +1 -0
  44. package/dist/commands/review/reject.js +73 -0
  45. package/dist/commands/review/reject.js.map +1 -0
  46. package/dist/commands/review/reports.d.ts +3 -0
  47. package/dist/commands/review/reports.d.ts.map +1 -0
  48. package/dist/commands/review/reports.js +90 -0
  49. package/dist/commands/review/reports.js.map +1 -0
  50. package/dist/commands/review/respond.d.ts +3 -0
  51. package/dist/commands/review/respond.d.ts.map +1 -0
  52. package/dist/commands/review/respond.js +106 -0
  53. package/dist/commands/review/respond.js.map +1 -0
  54. package/dist/commands/review/stats.d.ts +3 -0
  55. package/dist/commands/review/stats.d.ts.map +1 -0
  56. package/dist/commands/review/stats.js +71 -0
  57. package/dist/commands/review/stats.js.map +1 -0
  58. package/dist/index.js +2 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/utils/format.d.ts +28 -0
  61. package/dist/utils/format.d.ts.map +1 -1
  62. package/dist/utils/format.js +186 -0
  63. package/dist/utils/format.js.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,90 @@
1
+ import { Command, Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { commerceApi } from '../../api/rest/commerce.js';
4
+ import { handleError, createApiError } from '../../utils/error.js';
5
+ import { formatReportList } from '../../utils/format.js';
6
+ import { output } from '../../utils/output.js';
7
+ import { addEnhancedHelp } from '../../utils/helpText.js';
8
+ const cmd = new Command('reports')
9
+ .description('List review reports')
10
+ .addOption(new Option('-s, --status <status>', 'Filter by status')
11
+ .choices(['pending', 'reviewed', 'dismissed']))
12
+ .action(async (options) => {
13
+ try {
14
+ await listReports(options);
15
+ }
16
+ catch (error) {
17
+ handleError(error);
18
+ }
19
+ });
20
+ addEnhancedHelp(cmd, {
21
+ examples: [
22
+ '# List all reports',
23
+ '$ commerce review reports',
24
+ '',
25
+ '# Filter by pending status',
26
+ '$ commerce review reports --status pending',
27
+ ],
28
+ output: {
29
+ example: JSON.stringify({
30
+ success: true,
31
+ data: {
32
+ reports: [
33
+ {
34
+ id: 'report-uuid',
35
+ review_id: 'review-uuid',
36
+ reason: 'inappropriate',
37
+ description: 'Contains offensive language',
38
+ status: 'pending',
39
+ created_at: '2025-12-21T10:00:00Z',
40
+ },
41
+ ],
42
+ total: 1,
43
+ },
44
+ }, null, 2),
45
+ },
46
+ relatedCommands: [
47
+ { command: 'review handle-report', description: 'Process a report' },
48
+ { command: 'review get', description: 'View the reported review' },
49
+ { command: 'review delete', description: 'Delete reported review' },
50
+ ],
51
+ notes: [
52
+ 'Reports are submitted by customers for inappropriate content',
53
+ 'Use handle-report to mark reports as reviewed or dismissed',
54
+ 'Report reasons: fake, inappropriate, spam, other',
55
+ ],
56
+ });
57
+ export const reportsCommand = cmd;
58
+ async function listReports(options) {
59
+ const spinner = output.spinner('Fetching reports...');
60
+ try {
61
+ const params = {};
62
+ if (options.status) {
63
+ params.status = options.status;
64
+ }
65
+ const result = await commerceApi.reviews.listReports(params);
66
+ spinner.succeed('Reports fetched');
67
+ const reports = result.reports || [];
68
+ const total = result.total || 0;
69
+ if (output.isJson()) {
70
+ output.success({ reports, total }, `Retrieved ${reports.length} reports`);
71
+ }
72
+ else {
73
+ console.log();
74
+ console.log(chalk.cyan(`Found ${total} reports`));
75
+ console.log();
76
+ if (reports.length === 0) {
77
+ console.log(chalk.yellow('No reports found'));
78
+ }
79
+ else {
80
+ console.log(formatReportList(reports));
81
+ }
82
+ console.log();
83
+ }
84
+ }
85
+ catch (error) {
86
+ spinner.fail('Failed to fetch reports');
87
+ throw createApiError(error);
88
+ }
89
+ }
90
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../../src/commands/review/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const respondCommand: Command;
3
+ //# sourceMappingURL=respond.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/commands/review/respond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDpC,eAAO,MAAM,cAAc,SAAM,CAAC"}
@@ -0,0 +1,106 @@
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, requireParam } from '../../utils/interactive.js';
9
+ const cmd = new Command('respond')
10
+ .description('Add or update merchant response to a review')
11
+ .option('--id <uuid>', 'Review ID (required)')
12
+ .option('--content <text>', 'Response content (required)')
13
+ .action(async (options) => {
14
+ try {
15
+ await respondToReview(options);
16
+ }
17
+ catch (error) {
18
+ handleError(error);
19
+ }
20
+ });
21
+ addEnhancedHelp(cmd, {
22
+ examples: [
23
+ '# Reply to a review',
24
+ '$ commerce review respond --id abc-123-def --content "Thank you for your feedback!"',
25
+ '',
26
+ '# Interactive mode (prompt for content)',
27
+ '$ commerce review respond --id abc-123-def',
28
+ ],
29
+ output: {
30
+ example: JSON.stringify({
31
+ success: true,
32
+ data: {
33
+ review_id: 'abc-123-def',
34
+ merchant_response: 'Thank you for your feedback!',
35
+ merchant_response_at: '2025-12-21T12:00:00Z',
36
+ },
37
+ message: 'Response added',
38
+ }, null, 2),
39
+ },
40
+ relatedCommands: [
41
+ { command: 'review get', description: 'View review details' },
42
+ { command: 'review delete-response', description: 'Delete your response' },
43
+ { command: 'review list', description: 'Find reviews to respond to' },
44
+ ],
45
+ notes: [
46
+ 'You can only have one response per review',
47
+ 'Responding again will update the existing response',
48
+ 'Maximum 1000 characters',
49
+ ],
50
+ });
51
+ export const respondCommand = cmd;
52
+ async function respondToReview(options) {
53
+ const reviewId = isInteractiveEnvironment()
54
+ ? (options.id?.trim() || (() => { throw new ValidationError('Review ID is required', 'id'); })())
55
+ : requireParam(options.id, 'id', 'Review ID');
56
+ let content = options.content;
57
+ // Interactive prompt for content if not provided
58
+ if (!content && isInteractiveEnvironment()) {
59
+ const answers = await inquirer.prompt([
60
+ {
61
+ type: 'editor',
62
+ name: 'content',
63
+ message: 'Enter your response (max 1000 characters):',
64
+ validate: (input) => {
65
+ if (!input || input.trim().length === 0) {
66
+ return 'Response content is required';
67
+ }
68
+ if (input.length > 1000) {
69
+ return 'Response must be 1000 characters or less';
70
+ }
71
+ return true;
72
+ },
73
+ },
74
+ ]);
75
+ content = answers.content;
76
+ }
77
+ if (!content || content.trim().length === 0) {
78
+ throw new ValidationError('Response content is required (--content)', 'content');
79
+ }
80
+ if (content.length > 1000) {
81
+ throw new ValidationError('Response must be 1000 characters or less', 'content');
82
+ }
83
+ const spinner = output.spinner('Adding response...');
84
+ try {
85
+ const review = await commerceApi.reviews.respond(reviewId, content);
86
+ spinner.succeed('Response added');
87
+ if (output.isJson()) {
88
+ output.success({
89
+ review_id: review.id,
90
+ merchant_response: review.merchant_response,
91
+ merchant_response_at: review.merchant_response_at,
92
+ }, 'Response added');
93
+ }
94
+ else {
95
+ console.log();
96
+ console.log(chalk.green('Response added successfully'));
97
+ console.log(chalk.gray('Review ID: ') + chalk.white(review.id));
98
+ console.log();
99
+ }
100
+ }
101
+ catch (error) {
102
+ spinner.fail('Failed to add response');
103
+ throw createApiError(error);
104
+ }
105
+ }
106
+ //# sourceMappingURL=respond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../../src/commands/review/respond.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const statsCommand: Command;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/commands/review/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,eAAO,MAAM,YAAY,SAAM,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { Command } from 'commander';
2
+ import { commerceApi } from '../../api/rest/commerce.js';
3
+ import { handleError, createApiError } from '../../utils/error.js';
4
+ import { formatReviewStats } from '../../utils/format.js';
5
+ import { output } from '../../utils/output.js';
6
+ import { addEnhancedHelp } from '../../utils/helpText.js';
7
+ const cmd = new Command('stats')
8
+ .description('Get shop review statistics')
9
+ .action(async () => {
10
+ try {
11
+ await getReviewStats();
12
+ }
13
+ catch (error) {
14
+ handleError(error);
15
+ }
16
+ });
17
+ addEnhancedHelp(cmd, {
18
+ examples: [
19
+ '# Get review statistics',
20
+ '$ commerce review stats',
21
+ ],
22
+ output: {
23
+ example: JSON.stringify({
24
+ success: true,
25
+ data: {
26
+ total_reviews: 150,
27
+ average_rating: 4.5,
28
+ rating_distribution: {
29
+ '5': 80,
30
+ '4': 40,
31
+ '3': 20,
32
+ '2': 5,
33
+ '1': 5,
34
+ },
35
+ with_media_count: 30,
36
+ with_reply_count: 45,
37
+ featured_count: 10,
38
+ verified_count: 120,
39
+ },
40
+ message: 'Review statistics retrieved',
41
+ }, null, 2),
42
+ },
43
+ relatedCommands: [
44
+ { command: 'review list', description: 'View all reviews' },
45
+ { command: 'review list --status pending', description: 'View pending reviews' },
46
+ ],
47
+ notes: [
48
+ 'Shows overall review metrics for your store',
49
+ 'Rating distribution shows count for each star level',
50
+ ],
51
+ });
52
+ export const statsCommand = cmd;
53
+ async function getReviewStats() {
54
+ const spinner = output.spinner('Fetching review statistics...');
55
+ try {
56
+ const stats = await commerceApi.reviews.stats();
57
+ spinner.succeed('Statistics retrieved');
58
+ if (output.isJson()) {
59
+ output.success(stats, 'Review statistics retrieved');
60
+ }
61
+ else {
62
+ console.log();
63
+ console.log(formatReviewStats(stats));
64
+ }
65
+ }
66
+ catch (error) {
67
+ spinner.fail('Failed to fetch statistics');
68
+ throw createApiError(error);
69
+ }
70
+ }
71
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/commands/review/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,cAAc,EAAE,CAAC;IACzB,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,yBAAyB;QACzB,yBAAyB;KAC1B;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,aAAa,EAAE,GAAG;gBAClB,cAAc,EAAE,GAAG;gBACnB,mBAAmB,EAAE;oBACnB,GAAG,EAAE,EAAE;oBACP,GAAG,EAAE,EAAE;oBACP,GAAG,EAAE,EAAE;oBACP,GAAG,EAAE,CAAC;oBACN,GAAG,EAAE,CAAC;iBACP;gBACD,gBAAgB,EAAE,EAAE;gBACpB,gBAAgB,EAAE,EAAE;gBACpB,cAAc,EAAE,EAAE;gBAClB,cAAc,EAAE,GAAG;aACpB;YACD,OAAO,EAAE,6BAA6B;SACvC,EAAE,IAAI,EAAE,CAAC,CAAC;KACZ;IACD,eAAe,EAAE;QACf,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE;QAC3D,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,sBAAsB,EAAE;KACjF;IACD,KAAK,EAAE;QACL,6CAA6C;QAC7C,qDAAqD;KACtD;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC,KAAK,UAAU,cAAc;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAExC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ import collection from './commands/collection/index.js';
23
23
  import { testCommand } from './commands/test/index.js';
24
24
  import { productPageCommand } from './commands/product-page/index.js';
25
25
  import { easyshipCommand } from './commands/easyship/index.js';
26
+ import { reviewCommand } from './commands/review/index.js';
26
27
  import { output } from './utils/output.js';
27
28
  const __filename = fileURLToPath(import.meta.url);
28
29
  const __dirname = dirname(__filename);
@@ -108,6 +109,7 @@ program.addCommand(homepage);
108
109
  program.addCommand(collection);
109
110
  program.addCommand(productPageCommand);
110
111
  program.addCommand(easyshipCommand);
112
+ program.addCommand(reviewCommand);
111
113
  program
112
114
  .command('version')
113
115
  .description('显示版本信息')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -74,4 +74,32 @@ export declare function formatVariantList(variants: any[]): string;
74
74
  * 格式化变体详情
75
75
  */
76
76
  export declare function formatVariant(variant: any): string;
77
+ /**
78
+ * 格式化评价审核状态
79
+ */
80
+ export declare function formatReviewStatus(status: string): string;
81
+ /**
82
+ * 格式化举报状态
83
+ */
84
+ export declare function formatReportStatus(status: string): string;
85
+ /**
86
+ * 格式化评分星级
87
+ */
88
+ export declare function formatRating(rating: number): string;
89
+ /**
90
+ * 格式化评价列表
91
+ */
92
+ export declare function formatReviewList(reviews: any[]): string;
93
+ /**
94
+ * 格式化评价详情
95
+ */
96
+ export declare function formatReview(review: any): string;
97
+ /**
98
+ * 格式化评价统计
99
+ */
100
+ export declare function formatReviewStats(stats: any): string;
101
+ /**
102
+ * 格式化举报列表
103
+ */
104
+ export declare function formatReportList(reports: any[]): string;
77
105
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,MAAc,GAAG,MAAM,CAGpF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAGlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAU,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CA8BzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAyClD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CA8BrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAiE9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CA6BxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,MAAM,CA4B5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAyBpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAoCzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CA2ClD"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,MAAc,GAAG,MAAM,CAGpF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAGlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAU,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CA8BzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAyClD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CA8BrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAiE9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CA6BxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,MAAM,CA4B5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAyBpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,CAoCzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CA2ClD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAgCvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAqEhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAkCpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CA4BvD"}
@@ -403,4 +403,190 @@ export function formatVariant(variant) {
403
403
  lines.push(separator);
404
404
  return lines.join('\n');
405
405
  }
406
+ /**
407
+ * 格式化评价审核状态
408
+ */
409
+ export function formatReviewStatus(status) {
410
+ const statusMap = {
411
+ pending: { text: '待审核', color: chalk.yellow },
412
+ approved: { text: '已批准', color: chalk.green },
413
+ rejected: { text: '已拒绝', color: chalk.red },
414
+ };
415
+ const config = statusMap[status] || { text: status, color: chalk.white };
416
+ return config.color(config.text);
417
+ }
418
+ /**
419
+ * 格式化举报状态
420
+ */
421
+ export function formatReportStatus(status) {
422
+ const statusMap = {
423
+ pending: { text: '待处理', color: chalk.yellow },
424
+ reviewed: { text: '已审核', color: chalk.green },
425
+ dismissed: { text: '已驳回', color: chalk.gray },
426
+ };
427
+ const config = statusMap[status] || { text: status, color: chalk.white };
428
+ return config.color(config.text);
429
+ }
430
+ /**
431
+ * 格式化评分星级
432
+ */
433
+ export function formatRating(rating) {
434
+ const stars = '★'.repeat(rating) + '☆'.repeat(5 - rating);
435
+ return chalk.yellow(stars);
436
+ }
437
+ /**
438
+ * 格式化评价列表
439
+ */
440
+ export function formatReviewList(reviews) {
441
+ if (!reviews || reviews.length === 0) {
442
+ return chalk.yellow('暂无评价');
443
+ }
444
+ const table = new Table({
445
+ head: [
446
+ chalk.cyan('ID'),
447
+ chalk.cyan('评分'),
448
+ chalk.cyan('评价者'),
449
+ chalk.cyan('商品'),
450
+ chalk.cyan('状态'),
451
+ chalk.cyan('精选'),
452
+ chalk.cyan('时间'),
453
+ ],
454
+ colWidths: [14, 12, 18, 25, 10, 8, 18],
455
+ wordWrap: true,
456
+ });
457
+ reviews.forEach((review) => {
458
+ table.push([
459
+ truncateId(review.id, 12),
460
+ formatRating(review.rating || 0),
461
+ review.reviewer_name || review.customer_name || '-',
462
+ (review.product_name || '-').substring(0, 22) + (review.product_name?.length > 22 ? '...' : ''),
463
+ formatReviewStatus(review.moderation_status || 'pending'),
464
+ review.is_featured ? chalk.green('是') : chalk.gray('否'),
465
+ formatDate(review.created_at),
466
+ ]);
467
+ });
468
+ return table.toString();
469
+ }
470
+ /**
471
+ * 格式化评价详情
472
+ */
473
+ export function formatReview(review) {
474
+ const lines = [];
475
+ const separator = chalk.gray('─'.repeat(60));
476
+ lines.push(separator);
477
+ lines.push(chalk.cyan.bold('评价详情'));
478
+ lines.push(separator);
479
+ lines.push(`${chalk.gray('ID:')} ${review.id}`);
480
+ lines.push(`${chalk.gray('评分:')} ${formatRating(review.rating || 0)} (${review.rating}/5)`);
481
+ lines.push(`${chalk.gray('状态:')} ${formatReviewStatus(review.moderation_status || 'pending')}`);
482
+ if (review.title) {
483
+ lines.push(`${chalk.gray('标题:')} ${review.title}`);
484
+ }
485
+ if (review.content) {
486
+ lines.push(`${chalk.gray('内容:')} ${review.content}`);
487
+ }
488
+ lines.push('');
489
+ lines.push(chalk.gray('评价者信息'));
490
+ if (review.reviewer_name || review.customer_name) {
491
+ lines.push(`${chalk.gray('姓名:')} ${review.reviewer_name || review.customer_name}`);
492
+ }
493
+ if (review.reviewer_email) {
494
+ lines.push(`${chalk.gray('邮箱:')} ${review.reviewer_email}`);
495
+ }
496
+ if (review.is_verified_purchase) {
497
+ lines.push(`${chalk.gray('已验证购买:')} ${chalk.green('是')}`);
498
+ }
499
+ lines.push('');
500
+ lines.push(chalk.gray('商品信息'));
501
+ if (review.product_id) {
502
+ lines.push(`${chalk.gray('商品 ID:')} ${review.product_id}`);
503
+ }
504
+ if (review.product_name) {
505
+ lines.push(`${chalk.gray('商品名称:')} ${review.product_name}`);
506
+ }
507
+ lines.push('');
508
+ lines.push(chalk.gray('互动数据'));
509
+ lines.push(`${chalk.gray('有用:')} ${review.helpful_count || 0}`);
510
+ lines.push(`${chalk.gray('无用:')} ${review.not_helpful_count || 0}`);
511
+ lines.push(`${chalk.gray('精选:')} ${review.is_featured ? chalk.green('是') : chalk.gray('否')}`);
512
+ if (review.media_ids && review.media_ids.length > 0) {
513
+ lines.push(`${chalk.gray('媒体数量:')} ${review.media_ids.length}`);
514
+ }
515
+ if (review.merchant_response) {
516
+ lines.push('');
517
+ lines.push(chalk.cyan('商家回复'));
518
+ lines.push(`${chalk.gray('内容:')} ${review.merchant_response}`);
519
+ if (review.merchant_response_at) {
520
+ lines.push(`${chalk.gray('回复时间:')} ${formatDate(review.merchant_response_at)}`);
521
+ }
522
+ }
523
+ lines.push('');
524
+ lines.push(`${chalk.gray('创建时间:')} ${formatDate(review.created_at)}`);
525
+ if (review.is_edited) {
526
+ lines.push(`${chalk.gray('编辑时间:')} ${formatDate(review.edited_at)}`);
527
+ }
528
+ lines.push(separator);
529
+ return lines.join('\n');
530
+ }
531
+ /**
532
+ * 格式化评价统计
533
+ */
534
+ export function formatReviewStats(stats) {
535
+ const lines = [];
536
+ const separator = chalk.gray('─'.repeat(60));
537
+ lines.push(separator);
538
+ lines.push(chalk.cyan.bold('评价统计'));
539
+ lines.push(separator);
540
+ lines.push(`${chalk.gray('总评价数:')} ${stats.total_reviews || 0}`);
541
+ lines.push(`${chalk.gray('平均评分:')} ${formatRating(Math.round(stats.average_rating || 0))} (${(stats.average_rating || 0).toFixed(1)})`);
542
+ if (stats.rating_distribution) {
543
+ lines.push('');
544
+ lines.push(chalk.gray('评分分布:'));
545
+ for (let i = 5; i >= 1; i--) {
546
+ const count = stats.rating_distribution[i] || 0;
547
+ const total = stats.total_reviews || 1;
548
+ const percent = ((count / total) * 100).toFixed(1);
549
+ const bar = '█'.repeat(Math.round(count / total * 20));
550
+ lines.push(` ${chalk.yellow('★'.repeat(i) + '☆'.repeat(5 - i))} ${chalk.gray(bar.padEnd(20))} ${count} (${percent}%)`);
551
+ }
552
+ }
553
+ lines.push('');
554
+ lines.push(`${chalk.gray('带媒体:')} ${stats.with_media_count || 0}`);
555
+ lines.push(`${chalk.gray('已回复:')} ${stats.with_reply_count || 0}`);
556
+ lines.push(`${chalk.gray('精选数:')} ${stats.featured_count || 0}`);
557
+ if (stats.verified_count !== undefined) {
558
+ lines.push(`${chalk.gray('已验证购买:')} ${stats.verified_count}`);
559
+ }
560
+ lines.push(separator);
561
+ return lines.join('\n');
562
+ }
563
+ /**
564
+ * 格式化举报列表
565
+ */
566
+ export function formatReportList(reports) {
567
+ if (!reports || reports.length === 0) {
568
+ return chalk.yellow('暂无举报');
569
+ }
570
+ const table = new Table({
571
+ head: [
572
+ chalk.cyan('举报 ID'),
573
+ chalk.cyan('评价 ID'),
574
+ chalk.cyan('原因'),
575
+ chalk.cyan('状态'),
576
+ chalk.cyan('时间'),
577
+ ],
578
+ colWidths: [14, 14, 25, 12, 18],
579
+ wordWrap: true,
580
+ });
581
+ reports.forEach((report) => {
582
+ table.push([
583
+ truncateId(report.id, 12),
584
+ truncateId(report.review_id, 12),
585
+ report.reason || '-',
586
+ formatReportStatus(report.status || 'pending'),
587
+ formatDate(report.created_at),
588
+ ]);
589
+ });
590
+ return table.toString();
591
+ }
406
592
  //# sourceMappingURL=format.js.map