ecomcoder-cli 1.3.12 → 1.3.13
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/commands/product/add-tags.d.ts +9 -0
- package/dist/commands/product/add-tags.d.ts.map +1 -0
- package/dist/commands/product/add-tags.js +93 -0
- package/dist/commands/product/add-tags.js.map +1 -0
- package/dist/commands/product/create.d.ts.map +1 -1
- package/dist/commands/product/create.js +78 -4
- package/dist/commands/product/create.js.map +1 -1
- package/dist/commands/product/index.d.ts.map +1 -1
- package/dist/commands/product/index.js +32 -0
- package/dist/commands/product/index.js.map +1 -1
- package/dist/commands/product/queries.d.ts +23 -0
- package/dist/commands/product/queries.d.ts.map +1 -1
- package/dist/commands/product/queries.js +80 -0
- package/dist/commands/product/queries.js.map +1 -1
- package/dist/commands/product/remove-tags.d.ts +9 -0
- package/dist/commands/product/remove-tags.d.ts.map +1 -0
- package/dist/commands/product/remove-tags.js +108 -0
- package/dist/commands/product/remove-tags.js.map +1 -0
- package/dist/commands/product/service.d.ts +81 -2
- package/dist/commands/product/service.d.ts.map +1 -1
- package/dist/commands/product/service.js +291 -13
- package/dist/commands/product/service.js.map +1 -1
- package/dist/commands/product/set-tags.d.ts +9 -0
- package/dist/commands/product/set-tags.d.ts.map +1 -0
- package/dist/commands/product/set-tags.js +107 -0
- package/dist/commands/product/set-tags.js.map +1 -0
- package/dist/commands/product/types.d.ts +58 -0
- package/dist/commands/product/types.d.ts.map +1 -1
- package/dist/commands/product/update-images.d.ts +8 -0
- package/dist/commands/product/update-images.d.ts.map +1 -0
- package/dist/commands/product/update-images.js +191 -0
- package/dist/commands/product/update-images.js.map +1 -0
- package/dist/lib/image-library.d.ts +65 -0
- package/dist/lib/image-library.d.ts.map +1 -0
- package/dist/lib/image-library.js +143 -0
- package/dist/lib/image-library.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set/Replace Product Tags Command
|
|
3
|
+
*
|
|
4
|
+
* Following Command Pattern - thin orchestration layer
|
|
5
|
+
* Delegates business logic to ProductService
|
|
6
|
+
* DESTRUCTIVE - Requires approval flow
|
|
7
|
+
*/
|
|
8
|
+
import { getCredentials, getSessionId } from '../../lib/api-client.js';
|
|
9
|
+
import { parseArgs, hasHelpFlag } from '../../lib/args-parser.js';
|
|
10
|
+
import { ProductService } from './service.js';
|
|
11
|
+
import { requestApproval } from '../../lib/approval.js';
|
|
12
|
+
function showHelp() {
|
|
13
|
+
console.log(`
|
|
14
|
+
Set/Replace Product Tags
|
|
15
|
+
|
|
16
|
+
USAGE:
|
|
17
|
+
ecomcoder product set-tags --id=<id> --tags=<tag1,tag2,tag3>
|
|
18
|
+
|
|
19
|
+
REQUIRED OPTIONS:
|
|
20
|
+
--id <id> Product ID (numeric or GID)
|
|
21
|
+
--tags <tags> Comma-separated tags (replaces ALL existing tags)
|
|
22
|
+
|
|
23
|
+
EXAMPLES:
|
|
24
|
+
# Replace all tags
|
|
25
|
+
ecomcoder product set-tags --id=123 --tags="summer,sale,featured"
|
|
26
|
+
|
|
27
|
+
# Remove all tags (set to empty)
|
|
28
|
+
ecomcoder product set-tags --id=123 --tags=""
|
|
29
|
+
|
|
30
|
+
# Using GID
|
|
31
|
+
ecomcoder product set-tags --id="gid://shopify/Product/123" --tags="clearance"
|
|
32
|
+
|
|
33
|
+
NOTES:
|
|
34
|
+
- DESTRUCTIVE operation (replaces ALL existing tags)
|
|
35
|
+
- Requires approval before execution
|
|
36
|
+
- Pass empty string ("") to remove all tags
|
|
37
|
+
- Use add-tags for non-destructive tag additions
|
|
38
|
+
- Use remove-tags to selectively remove specific tags
|
|
39
|
+
- Tags are case-sensitive
|
|
40
|
+
`);
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
export async function run(argv = process.argv.slice(2)) {
|
|
44
|
+
if (hasHelpFlag(argv)) {
|
|
45
|
+
showHelp();
|
|
46
|
+
}
|
|
47
|
+
const args = parseArgs(argv);
|
|
48
|
+
// Validate required arguments
|
|
49
|
+
if (!args.id) {
|
|
50
|
+
console.error(JSON.stringify({
|
|
51
|
+
success: false,
|
|
52
|
+
error: 'Missing required argument: --id'
|
|
53
|
+
}));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (args.tags === undefined) {
|
|
57
|
+
console.error(JSON.stringify({
|
|
58
|
+
success: false,
|
|
59
|
+
error: 'Missing required argument: --tags (use "" to remove all tags)'
|
|
60
|
+
}));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
// Parse tags from comma-separated string (empty string = remove all)
|
|
65
|
+
const tags = args.tags === ''
|
|
66
|
+
? []
|
|
67
|
+
: args.tags.split(',').map((tag) => tag.trim()).filter(Boolean);
|
|
68
|
+
// Get credentials
|
|
69
|
+
const sessionId = getSessionId(args.sessionId);
|
|
70
|
+
const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
|
|
71
|
+
// Request approval before executing
|
|
72
|
+
const tagCount = tags.length;
|
|
73
|
+
const message = tagCount === 0
|
|
74
|
+
? `This will REMOVE ALL tags from your product on the live Shopify store.`
|
|
75
|
+
: `This will REPLACE all existing tags with ${tagCount} new tag(s) on your live Shopify store. All current tags will be removed.`;
|
|
76
|
+
const approved = await requestApproval({
|
|
77
|
+
command: `ecomcoder product set-tags --id=${args.id} --tags=${args.tags}`,
|
|
78
|
+
message,
|
|
79
|
+
riskLevel: 'moderate'
|
|
80
|
+
});
|
|
81
|
+
if (!approved) {
|
|
82
|
+
console.log(JSON.stringify({
|
|
83
|
+
success: false,
|
|
84
|
+
error: 'Operation cancelled by user'
|
|
85
|
+
}));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// Execute set via service
|
|
89
|
+
const result = await ProductService.setTags(credentials, {
|
|
90
|
+
id: args.id,
|
|
91
|
+
tags
|
|
92
|
+
});
|
|
93
|
+
// Output result
|
|
94
|
+
console.log(JSON.stringify(result, null, 2));
|
|
95
|
+
if (!result.success) {
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(JSON.stringify({
|
|
101
|
+
success: false,
|
|
102
|
+
error: error.message || 'Unknown error occurred'
|
|
103
|
+
}));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=set-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-tags.js","sourceRoot":"","sources":["../../../src/commands/product/set-tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -211,6 +211,16 @@ export interface UpdateOptionInput {
|
|
|
211
211
|
deleteValues?: string[];
|
|
212
212
|
variantStrategy?: 'LEAVE_AS_IS' | 'CREATE';
|
|
213
213
|
}
|
|
214
|
+
export interface UpdateImagesInput {
|
|
215
|
+
id: string;
|
|
216
|
+
images?: Array<string | {
|
|
217
|
+
url: string;
|
|
218
|
+
alt?: string;
|
|
219
|
+
}>;
|
|
220
|
+
search?: string;
|
|
221
|
+
random?: number;
|
|
222
|
+
source?: 'pexels' | 'picsum';
|
|
223
|
+
}
|
|
214
224
|
/**
|
|
215
225
|
* Shopify GraphQL response types
|
|
216
226
|
*/
|
|
@@ -221,6 +231,7 @@ export interface ProductUpdateResponse {
|
|
|
221
231
|
title: string;
|
|
222
232
|
description: string;
|
|
223
233
|
templateSuffix: string | null;
|
|
234
|
+
tags?: string[];
|
|
224
235
|
};
|
|
225
236
|
userErrors: ShopifyUserError[];
|
|
226
237
|
};
|
|
@@ -402,4 +413,51 @@ export interface NormalizedId {
|
|
|
402
413
|
gid: string;
|
|
403
414
|
numeric: string;
|
|
404
415
|
}
|
|
416
|
+
/**
|
|
417
|
+
* Input type for add-tags command
|
|
418
|
+
*/
|
|
419
|
+
export interface AddTagsInput {
|
|
420
|
+
id: string;
|
|
421
|
+
tags: string[];
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Input type for remove-tags command
|
|
425
|
+
*/
|
|
426
|
+
export interface RemoveTagsInput {
|
|
427
|
+
id: string;
|
|
428
|
+
tags: string[];
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Input type for set-tags command
|
|
432
|
+
*/
|
|
433
|
+
export interface SetTagsInput {
|
|
434
|
+
id: string;
|
|
435
|
+
tags: string[];
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Response type for tagsAdd mutation
|
|
439
|
+
*/
|
|
440
|
+
export interface TagsAddResponse {
|
|
441
|
+
tagsAdd: {
|
|
442
|
+
node: {
|
|
443
|
+
id: string;
|
|
444
|
+
title: string;
|
|
445
|
+
tags: string[];
|
|
446
|
+
} | null;
|
|
447
|
+
userErrors: ShopifyUserError[];
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Response type for tagsRemove mutation
|
|
452
|
+
*/
|
|
453
|
+
export interface TagsRemoveResponse {
|
|
454
|
+
tagsRemove: {
|
|
455
|
+
node: {
|
|
456
|
+
id: string;
|
|
457
|
+
title: string;
|
|
458
|
+
tags: string[];
|
|
459
|
+
} | null;
|
|
460
|
+
userErrors: ShopifyUserError[];
|
|
461
|
+
};
|
|
462
|
+
}
|
|
405
463
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/product/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,QAAQ,EAAE;QACR,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,cAAc,CAAC;SACtB,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,YAAY,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;IACF,YAAY,EAAE;QACZ,eAAe,EAAE,YAAY,CAAC;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,UAAU,EAAE;QACV,GAAG,EAAE,YAAY,CAAC;QAClB,GAAG,EAAE,YAAY,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;CACtD;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE;YACd,GAAG,CAAC,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,CAAC;CACrE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE;QACb,OAAO,EAAE;YACP,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/product/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-images.d.ts","sourceRoot":"","sources":["../../../src/commands/product/update-images.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0EH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBAkI/D"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Product Images Command
|
|
3
|
+
*
|
|
4
|
+
* Following Command Pattern - thin orchestration layer
|
|
5
|
+
* Delegates business logic to ProductService
|
|
6
|
+
*/
|
|
7
|
+
import { getCredentials, getSessionId } from '../../lib/api-client.js';
|
|
8
|
+
import { parseArgs, hasHelpFlag } from '../../lib/args-parser.js';
|
|
9
|
+
import { ProductService } from './service.js';
|
|
10
|
+
import { requestApproval } from '../../lib/approval.js';
|
|
11
|
+
function showHelp() {
|
|
12
|
+
console.log(`
|
|
13
|
+
Update Product Images
|
|
14
|
+
|
|
15
|
+
Add smart, context-aware images to your products. Images are automatically
|
|
16
|
+
selected based on your product title, or you can provide custom URLs.
|
|
17
|
+
|
|
18
|
+
USAGE:
|
|
19
|
+
ecomcoder product update-images [OPTIONS]
|
|
20
|
+
|
|
21
|
+
REQUIRED:
|
|
22
|
+
--id <id> Product ID (numeric or GID format)
|
|
23
|
+
|
|
24
|
+
OPTIONS (at least one required):
|
|
25
|
+
--images <json> JSON array of image URLs or objects with url/alt
|
|
26
|
+
--search <query> Search Pexels for specific images (e.g., "organic skincare")
|
|
27
|
+
--random <count> Generate N random placeholder images (default: 6)
|
|
28
|
+
--source <source> Image source: 'pexels' or 'picsum' (default: pexels)
|
|
29
|
+
--session-id Session ID (auto-provided via SESSION_ID env var)
|
|
30
|
+
--help, -h Show this help message
|
|
31
|
+
|
|
32
|
+
EXAMPLES:
|
|
33
|
+
# Add images from custom URLs
|
|
34
|
+
ecomcoder product update-images --id=123 \\
|
|
35
|
+
--images='["https://example.com/1.jpg","https://example.com/2.jpg"]'
|
|
36
|
+
|
|
37
|
+
# Add images with alt text
|
|
38
|
+
ecomcoder product update-images --id=123 \\
|
|
39
|
+
--images='[{"url":"https://example.com/1.jpg","alt":"Front view"}]'
|
|
40
|
+
|
|
41
|
+
# Search Pexels for specific images
|
|
42
|
+
ecomcoder product update-images --id=123 --search="organic skincare"
|
|
43
|
+
|
|
44
|
+
# Generate 5 random placeholder images
|
|
45
|
+
ecomcoder product update-images --id=123 --random=5
|
|
46
|
+
|
|
47
|
+
# Use Lorem Picsum instead of Pexels
|
|
48
|
+
ecomcoder product update-images --id=123 --random=6 --source=picsum
|
|
49
|
+
|
|
50
|
+
SMART IMAGE SELECTION:
|
|
51
|
+
When using --search, the CLI searches Pexels for relevant, high-quality
|
|
52
|
+
stock photos. This gives your products professional imagery that matches
|
|
53
|
+
the product type.
|
|
54
|
+
|
|
55
|
+
Example: Searching for "hair serum" returns actual skincare product images
|
|
56
|
+
instead of random placeholders.
|
|
57
|
+
|
|
58
|
+
IMPORTANT NOTES:
|
|
59
|
+
⚠️ Adding Images: This command ADDS new images to the product.
|
|
60
|
+
It does not replace existing images. To replace all images:
|
|
61
|
+
1. Delete old images manually in Shopify Admin
|
|
62
|
+
2. Run this command to add new images
|
|
63
|
+
|
|
64
|
+
ℹ️ Image Sources:
|
|
65
|
+
- pexels: High-quality stock photos (requires PEXELS_API_KEY env var)
|
|
66
|
+
Falls back to Lorem Picsum if API key not set
|
|
67
|
+
- picsum: Lorem Picsum placeholders (no API key required)
|
|
68
|
+
|
|
69
|
+
ℹ️ Async Upload: Shopify processes image uploads asynchronously.
|
|
70
|
+
Images may take a few seconds to appear in your store.
|
|
71
|
+
|
|
72
|
+
ℹ️ Get Pexels API Key: https://www.pexels.com/api/ (free, 200/hour limit)
|
|
73
|
+
Set environment variable: export PEXELS_API_KEY=your-key-here
|
|
74
|
+
`);
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
export async function run(argv = process.argv.slice(2)) {
|
|
78
|
+
if (hasHelpFlag(argv)) {
|
|
79
|
+
showHelp();
|
|
80
|
+
}
|
|
81
|
+
const args = parseArgs(argv);
|
|
82
|
+
// Validate required argument
|
|
83
|
+
if (!args.id) {
|
|
84
|
+
console.error(JSON.stringify({
|
|
85
|
+
success: false,
|
|
86
|
+
error: 'Missing required argument: --id'
|
|
87
|
+
}));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Validate that at least one image source is provided
|
|
91
|
+
if (!args.images && !args.search && !args.random) {
|
|
92
|
+
console.error(JSON.stringify({
|
|
93
|
+
success: false,
|
|
94
|
+
error: 'At least one of --images, --search, or --random must be provided'
|
|
95
|
+
}));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// Parse images if provided
|
|
99
|
+
let parsedImages;
|
|
100
|
+
if (args.images) {
|
|
101
|
+
try {
|
|
102
|
+
parsedImages = JSON.parse(args.images);
|
|
103
|
+
if (!Array.isArray(parsedImages)) {
|
|
104
|
+
throw new Error('--images must be a JSON array');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error(JSON.stringify({
|
|
109
|
+
success: false,
|
|
110
|
+
error: `Invalid --images format: ${error.message}. Expected JSON array.`
|
|
111
|
+
}));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Validate source if provided
|
|
116
|
+
if (args.source && !['picsum', 'pexels'].includes(args.source)) {
|
|
117
|
+
console.error(JSON.stringify({
|
|
118
|
+
success: false,
|
|
119
|
+
error: 'Invalid --source. Must be "picsum" or "pexels"'
|
|
120
|
+
}));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
// Validate random count if provided
|
|
124
|
+
if (args.random) {
|
|
125
|
+
const count = parseInt(args.random);
|
|
126
|
+
if (isNaN(count) || count < 1 || count > 50) {
|
|
127
|
+
console.error(JSON.stringify({
|
|
128
|
+
success: false,
|
|
129
|
+
error: 'Invalid --random value. Must be a number between 1 and 50'
|
|
130
|
+
}));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
// Get credentials
|
|
136
|
+
const sessionId = getSessionId(args.sessionId);
|
|
137
|
+
const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
|
|
138
|
+
// Request approval
|
|
139
|
+
const operationDesc = args.images
|
|
140
|
+
? `add custom images`
|
|
141
|
+
: args.search
|
|
142
|
+
? `add images for "${args.search}"`
|
|
143
|
+
: `add ${args.random || 6} random images`;
|
|
144
|
+
const approved = await requestApproval({
|
|
145
|
+
command: `ecomcoder product update-images --id=${args.id}`,
|
|
146
|
+
message: `This will ${operationDesc} to product ${args.id}`,
|
|
147
|
+
riskLevel: 'moderate'
|
|
148
|
+
});
|
|
149
|
+
if (!approved) {
|
|
150
|
+
console.log(JSON.stringify({
|
|
151
|
+
success: false,
|
|
152
|
+
error: 'Operation cancelled by user'
|
|
153
|
+
}));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
// Build input for service
|
|
157
|
+
const input = {
|
|
158
|
+
id: args.id
|
|
159
|
+
};
|
|
160
|
+
if (parsedImages) {
|
|
161
|
+
input.images = parsedImages;
|
|
162
|
+
}
|
|
163
|
+
if (args.search) {
|
|
164
|
+
input.search = args.search;
|
|
165
|
+
}
|
|
166
|
+
if (args.random) {
|
|
167
|
+
input.random = parseInt(args.random);
|
|
168
|
+
}
|
|
169
|
+
if (args.source) {
|
|
170
|
+
input.source = args.source;
|
|
171
|
+
}
|
|
172
|
+
// Execute update via service
|
|
173
|
+
const result = await ProductService.updateImages(credentials, input);
|
|
174
|
+
// Output result
|
|
175
|
+
console.log(JSON.stringify(result, null, 2));
|
|
176
|
+
if (result.success) {
|
|
177
|
+
console.error(`\n✅ ${result.data?.imagesAdded || 0} image(s) added to product. Images upload asynchronously and may take a few seconds to appear.\n`);
|
|
178
|
+
}
|
|
179
|
+
if (!result.success) {
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error(JSON.stringify({
|
|
185
|
+
success: false,
|
|
186
|
+
error: error.message || 'Unknown error occurred'
|
|
187
|
+
}));
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=update-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-images.js","sourceRoot":"","sources":["../../../src/commands/product/update-images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image Library Service
|
|
3
|
+
* Provides smart, context-aware images for products
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Extract keywords from product title
|
|
7
|
+
* 2. Search Pexels for relevant images (if API key available)
|
|
8
|
+
* 3. Fallback to Lorem Picsum if Pexels unavailable/fails
|
|
9
|
+
*/
|
|
10
|
+
export interface ImageSource {
|
|
11
|
+
url: string;
|
|
12
|
+
alt?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extract meaningful keywords from product title for image search
|
|
16
|
+
*
|
|
17
|
+
* Examples:
|
|
18
|
+
* - "Premium Hair Serum - Natural Formula" → "hair serum"
|
|
19
|
+
* - "Nike Running Shoes Size 10" → "running shoes"
|
|
20
|
+
* - "Organic Skincare Bundle" → "skincare"
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractSearchKeywords(title: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate random placeholder images using Lorem Picsum
|
|
25
|
+
* No API key required, no rate limits
|
|
26
|
+
*
|
|
27
|
+
* @param count Number of images to generate (default: 6)
|
|
28
|
+
* @returns Array of image sources with Lorem Picsum URLs
|
|
29
|
+
*/
|
|
30
|
+
export declare function getRandomPlaceholderImages(count?: number): ImageSource[];
|
|
31
|
+
/**
|
|
32
|
+
* Search Pexels for relevant product images based on query
|
|
33
|
+
* Requires PEXELS_API_KEY environment variable
|
|
34
|
+
*
|
|
35
|
+
* @param query Search query (e.g., "hair serum", "running shoes")
|
|
36
|
+
* @param count Number of images to fetch (default: 6, max: 80)
|
|
37
|
+
* @returns Array of high-quality stock photos from Pexels
|
|
38
|
+
*/
|
|
39
|
+
export declare function searchPexelsForProduct(query: string, count?: number): Promise<ImageSource[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Get smart, context-aware images for a product
|
|
42
|
+
*
|
|
43
|
+
* This is the main function to use for product image generation.
|
|
44
|
+
* It intelligently selects images based on the product title.
|
|
45
|
+
*
|
|
46
|
+
* Strategy:
|
|
47
|
+
* 1. Extract keywords from product title
|
|
48
|
+
* 2. Search Pexels for relevant images (if API key available)
|
|
49
|
+
* 3. Fallback to Lorem Picsum if needed
|
|
50
|
+
*
|
|
51
|
+
* @param productTitle The product title (e.g., "Premium Hair Serum")
|
|
52
|
+
* @param count Number of images to fetch (default: 6)
|
|
53
|
+
* @param customQuery Optional custom search query (overrides title extraction)
|
|
54
|
+
* @returns Array of context-appropriate images
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* // Automatically extracts "hair serum" and searches Pexels
|
|
58
|
+
* const images = await getSmartProductImages("Premium Hair Serum - Natural Formula");
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Use custom search query
|
|
62
|
+
* const images = await getSmartProductImages("Product Name", 5, "organic skincare");
|
|
63
|
+
*/
|
|
64
|
+
export declare function getSmartProductImages(productTitle: string, count?: number, customQuery?: string): Promise<ImageSource[]>;
|
|
65
|
+
//# sourceMappingURL=image-library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-library.d.ts","sourceRoot":"","sources":["../../src/lib/image-library.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2B3D;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,GAAE,MAAU,GAAG,WAAW,EAAE,CAY3E;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAoDxB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAU,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAQxB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image Library Service
|
|
3
|
+
* Provides smart, context-aware images for products
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Extract keywords from product title
|
|
7
|
+
* 2. Search Pexels for relevant images (if API key available)
|
|
8
|
+
* 3. Fallback to Lorem Picsum if Pexels unavailable/fails
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Extract meaningful keywords from product title for image search
|
|
12
|
+
*
|
|
13
|
+
* Examples:
|
|
14
|
+
* - "Premium Hair Serum - Natural Formula" → "hair serum"
|
|
15
|
+
* - "Nike Running Shoes Size 10" → "running shoes"
|
|
16
|
+
* - "Organic Skincare Bundle" → "skincare"
|
|
17
|
+
*/
|
|
18
|
+
export function extractSearchKeywords(title) {
|
|
19
|
+
// Remove common filler words and qualifiers
|
|
20
|
+
const fillerWords = [
|
|
21
|
+
'premium', 'deluxe', 'professional', 'natural', 'organic',
|
|
22
|
+
'new', 'best', 'top', 'quality', 'high', 'low',
|
|
23
|
+
'small', 'medium', 'large', 'xl', 'xxl',
|
|
24
|
+
'pack', 'set', 'bundle', 'kit', 'collection',
|
|
25
|
+
'size', 'color', 'variant', 'option'
|
|
26
|
+
];
|
|
27
|
+
// Remove HTML tags if present
|
|
28
|
+
let cleanTitle = title.replace(/<[^>]*>/g, '');
|
|
29
|
+
// Split by common separators
|
|
30
|
+
cleanTitle = cleanTitle.split(/[-–—:|]/)[0].trim();
|
|
31
|
+
// Convert to lowercase and split into words
|
|
32
|
+
const words = cleanTitle.toLowerCase()
|
|
33
|
+
.replace(/[^\w\s]/g, ' ') // Remove special chars
|
|
34
|
+
.split(/\s+/)
|
|
35
|
+
.filter(word => word.length > 2); // Remove very short words
|
|
36
|
+
// Filter out filler words
|
|
37
|
+
const meaningfulWords = words.filter(word => !fillerWords.includes(word));
|
|
38
|
+
// Return first 2-3 meaningful words for better search results
|
|
39
|
+
return meaningfulWords.slice(0, 3).join(' ') || cleanTitle.toLowerCase();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate random placeholder images using Lorem Picsum
|
|
43
|
+
* No API key required, no rate limits
|
|
44
|
+
*
|
|
45
|
+
* @param count Number of images to generate (default: 6)
|
|
46
|
+
* @returns Array of image sources with Lorem Picsum URLs
|
|
47
|
+
*/
|
|
48
|
+
export function getRandomPlaceholderImages(count = 6) {
|
|
49
|
+
const images = [];
|
|
50
|
+
for (let i = 0; i < count; i++) {
|
|
51
|
+
const seed = Date.now() + i; // Unique seed for variety
|
|
52
|
+
images.push({
|
|
53
|
+
url: `https://picsum.photos/seed/${seed}/800/800`,
|
|
54
|
+
alt: `Product Image ${i + 1}`
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return images;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Search Pexels for relevant product images based on query
|
|
61
|
+
* Requires PEXELS_API_KEY environment variable
|
|
62
|
+
*
|
|
63
|
+
* @param query Search query (e.g., "hair serum", "running shoes")
|
|
64
|
+
* @param count Number of images to fetch (default: 6, max: 80)
|
|
65
|
+
* @returns Array of high-quality stock photos from Pexels
|
|
66
|
+
*/
|
|
67
|
+
export async function searchPexelsForProduct(query, count = 6) {
|
|
68
|
+
const apiKey = process.env.PEXELS_API_KEY;
|
|
69
|
+
if (!apiKey) {
|
|
70
|
+
console.error('ℹ️ PEXELS_API_KEY not set. Using Lorem Picsum placeholders instead.');
|
|
71
|
+
console.error(' Get free API key at: https://www.pexels.com/api/');
|
|
72
|
+
return getRandomPlaceholderImages(count);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const limit = Math.min(count, 80); // Pexels max per request
|
|
76
|
+
const params = new URLSearchParams({
|
|
77
|
+
query: query,
|
|
78
|
+
per_page: limit.toString(),
|
|
79
|
+
orientation: 'square' // Square images work best for product thumbnails
|
|
80
|
+
});
|
|
81
|
+
const response = await fetch(`https://api.pexels.com/v1/search?${params}`, {
|
|
82
|
+
headers: {
|
|
83
|
+
'Authorization': apiKey
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
if (response.status === 429) {
|
|
88
|
+
console.error('⚠️ Pexels rate limit exceeded. Using Lorem Picsum placeholders.');
|
|
89
|
+
console.error(' Free tier: 200/hour, 20,000/month');
|
|
90
|
+
return getRandomPlaceholderImages(count);
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Pexels API error: ${response.status}`);
|
|
93
|
+
}
|
|
94
|
+
const data = await response.json();
|
|
95
|
+
if (!data.photos || data.photos.length === 0) {
|
|
96
|
+
console.error(`ℹ️ No Pexels images found for "${query}". Using Lorem Picsum placeholders.`);
|
|
97
|
+
return getRandomPlaceholderImages(count);
|
|
98
|
+
}
|
|
99
|
+
// Map Pexels photos to our ImageSource format
|
|
100
|
+
const images = data.photos.map((photo, index) => ({
|
|
101
|
+
url: photo.src.large2x || photo.src.large, // High quality image
|
|
102
|
+
alt: photo.alt || `${query} - Image ${index + 1}`
|
|
103
|
+
}));
|
|
104
|
+
console.error(`✅ Found ${images.length} relevant images from Pexels for "${query}"`);
|
|
105
|
+
return images;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error(`⚠️ Pexels search failed: ${error.message}. Using Lorem Picsum placeholders.`);
|
|
109
|
+
return getRandomPlaceholderImages(count);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get smart, context-aware images for a product
|
|
114
|
+
*
|
|
115
|
+
* This is the main function to use for product image generation.
|
|
116
|
+
* It intelligently selects images based on the product title.
|
|
117
|
+
*
|
|
118
|
+
* Strategy:
|
|
119
|
+
* 1. Extract keywords from product title
|
|
120
|
+
* 2. Search Pexels for relevant images (if API key available)
|
|
121
|
+
* 3. Fallback to Lorem Picsum if needed
|
|
122
|
+
*
|
|
123
|
+
* @param productTitle The product title (e.g., "Premium Hair Serum")
|
|
124
|
+
* @param count Number of images to fetch (default: 6)
|
|
125
|
+
* @param customQuery Optional custom search query (overrides title extraction)
|
|
126
|
+
* @returns Array of context-appropriate images
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* // Automatically extracts "hair serum" and searches Pexels
|
|
130
|
+
* const images = await getSmartProductImages("Premium Hair Serum - Natural Formula");
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* // Use custom search query
|
|
134
|
+
* const images = await getSmartProductImages("Product Name", 5, "organic skincare");
|
|
135
|
+
*/
|
|
136
|
+
export async function getSmartProductImages(productTitle, count = 6, customQuery) {
|
|
137
|
+
// Use custom query if provided, otherwise extract from title
|
|
138
|
+
const searchQuery = customQuery || extractSearchKeywords(productTitle);
|
|
139
|
+
console.error(`🔍 Searching for images: "${searchQuery}"`);
|
|
140
|
+
// Try Pexels first, will auto-fallback to Lorem Picsum if needed
|
|
141
|
+
return await searchPexelsForProduct(searchQuery, count);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=image-library.js.map
|