ecomcoder-cli 1.3.11 → 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/README.md +16 -0
- package/dist/commands/asset/delete.d.ts.map +1 -1
- package/dist/commands/asset/delete.js +14 -0
- package/dist/commands/asset/delete.js.map +1 -1
- package/dist/commands/asset/import.d.ts.map +1 -1
- package/dist/commands/asset/import.js +14 -0
- package/dist/commands/asset/import.js.map +1 -1
- package/dist/commands/asset/upload.d.ts.map +1 -1
- package/dist/commands/asset/upload.js +14 -0
- package/dist/commands/asset/upload.js.map +1 -1
- package/dist/commands/create-dummy-products.d.ts.map +1 -1
- package/dist/commands/create-dummy-products.js +14 -0
- package/dist/commands/create-dummy-products.js.map +1 -1
- package/dist/commands/create-metafield.d.ts.map +1 -1
- package/dist/commands/create-metafield.js +14 -0
- package/dist/commands/create-metafield.js.map +1 -1
- package/dist/commands/discount/create-basic.d.ts.map +1 -1
- package/dist/commands/discount/create-basic.js +14 -0
- package/dist/commands/discount/create-basic.js.map +1 -1
- package/dist/commands/discount/create-bxgy.d.ts.map +1 -1
- package/dist/commands/discount/create-bxgy.js +14 -0
- package/dist/commands/discount/create-bxgy.js.map +1 -1
- package/dist/commands/discount/create-shipping.d.ts.map +1 -1
- package/dist/commands/discount/create-shipping.js +14 -0
- package/dist/commands/discount/create-shipping.js.map +1 -1
- package/dist/commands/discount/delete.d.ts.map +1 -1
- package/dist/commands/discount/delete.js +14 -0
- package/dist/commands/discount/delete.js.map +1 -1
- package/dist/commands/product/add-options.d.ts.map +1 -1
- package/dist/commands/product/add-options.js +14 -0
- package/dist/commands/product/add-options.js.map +1 -1
- 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-variants.d.ts.map +1 -1
- package/dist/commands/product/create-variants.js +14 -0
- package/dist/commands/product/create-variants.js.map +1 -1
- package/dist/commands/product/create.d.ts.map +1 -1
- package/dist/commands/product/create.js +92 -4
- package/dist/commands/product/create.js.map +1 -1
- package/dist/commands/product/delete-variants.d.ts.map +1 -1
- package/dist/commands/product/delete-variants.js +14 -0
- package/dist/commands/product/delete-variants.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-metafield.d.ts.map +1 -1
- package/dist/commands/product/set-metafield.js +14 -0
- package/dist/commands/product/set-metafield.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-description.d.ts.map +1 -1
- package/dist/commands/product/update-description.js +14 -0
- package/dist/commands/product/update-description.js.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/commands/product/update-options.d.ts.map +1 -1
- package/dist/commands/product/update-options.js +14 -0
- package/dist/commands/product/update-options.js.map +1 -1
- package/dist/commands/product/update-price.d.ts.map +1 -1
- package/dist/commands/product/update-price.js +14 -0
- package/dist/commands/product/update-price.js.map +1 -1
- package/dist/commands/product/update-status.d.ts.map +1 -1
- package/dist/commands/product/update-status.js +14 -0
- package/dist/commands/product/update-status.js.map +1 -1
- package/dist/commands/product/update-template.d.ts.map +1 -1
- package/dist/commands/product/update-template.js +14 -0
- package/dist/commands/product/update-template.js.map +1 -1
- package/dist/commands/product/update-title.d.ts.map +1 -1
- package/dist/commands/product/update-title.js +14 -0
- package/dist/commands/product/update-title.js.map +1 -1
- package/dist/commands/set-product-rating.d.ts.map +1 -1
- package/dist/commands/set-product-rating.js +14 -0
- package/dist/commands/set-product-rating.js.map +1 -1
- package/dist/commands/shop/set-metafield.d.ts.map +1 -1
- package/dist/commands/shop/set-metafield.js +14 -0
- package/dist/commands/shop/set-metafield.js.map +1 -1
- package/dist/lib/approval.d.ts +28 -0
- package/dist/lib/approval.d.ts.map +1 -0
- package/dist/lib/approval.js +38 -0
- package/dist/lib/approval.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,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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-library.js","sourceRoot":"","sources":["../../src/lib/image-library.ts"],"names":[],"mappings":"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"}
|