ecomcoder-cli 1.3.12 → 1.3.14

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 (45) hide show
  1. package/dist/commands/product/add-tags.d.ts +9 -0
  2. package/dist/commands/product/add-tags.d.ts.map +1 -0
  3. package/dist/commands/product/add-tags.js +93 -0
  4. package/dist/commands/product/add-tags.js.map +1 -0
  5. package/dist/commands/product/create.d.ts.map +1 -1
  6. package/dist/commands/product/create.js +78 -4
  7. package/dist/commands/product/create.js.map +1 -1
  8. package/dist/commands/product/index.d.ts.map +1 -1
  9. package/dist/commands/product/index.js +32 -0
  10. package/dist/commands/product/index.js.map +1 -1
  11. package/dist/commands/product/queries.d.ts +23 -0
  12. package/dist/commands/product/queries.d.ts.map +1 -1
  13. package/dist/commands/product/queries.js +80 -0
  14. package/dist/commands/product/queries.js.map +1 -1
  15. package/dist/commands/product/remove-tags.d.ts +9 -0
  16. package/dist/commands/product/remove-tags.d.ts.map +1 -0
  17. package/dist/commands/product/remove-tags.js +108 -0
  18. package/dist/commands/product/remove-tags.js.map +1 -0
  19. package/dist/commands/product/service.d.ts +81 -2
  20. package/dist/commands/product/service.d.ts.map +1 -1
  21. package/dist/commands/product/service.js +291 -13
  22. package/dist/commands/product/service.js.map +1 -1
  23. package/dist/commands/product/set-tags.d.ts +9 -0
  24. package/dist/commands/product/set-tags.d.ts.map +1 -0
  25. package/dist/commands/product/set-tags.js +107 -0
  26. package/dist/commands/product/set-tags.js.map +1 -0
  27. package/dist/commands/product/types.d.ts +58 -0
  28. package/dist/commands/product/types.d.ts.map +1 -1
  29. package/dist/commands/product/update-images.d.ts +8 -0
  30. package/dist/commands/product/update-images.d.ts.map +1 -0
  31. package/dist/commands/product/update-images.js +191 -0
  32. package/dist/commands/product/update-images.js.map +1 -0
  33. package/dist/lib/approval.d.ts +19 -4
  34. package/dist/lib/approval.d.ts.map +1 -1
  35. package/dist/lib/approval.js +26 -5
  36. package/dist/lib/approval.js.map +1 -1
  37. package/dist/lib/config.d.ts +52 -0
  38. package/dist/lib/config.d.ts.map +1 -0
  39. package/dist/lib/config.js +83 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/image-library.d.ts +65 -0
  42. package/dist/lib/image-library.d.ts.map +1 -0
  43. package/dist/lib/image-library.js +143 -0
  44. package/dist/lib/image-library.js.map +1 -0
  45. package/package.json +2 -1
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Configuration Management
3
+ *
4
+ * Centralized configuration for CLI behavior
5
+ * Supports multiple configuration sources with priority order:
6
+ * 1. Environment variables (highest priority)
7
+ * 2. .ecomcoder.json in current directory
8
+ * 3. .ecomcoder.json in home directory
9
+ * 4. Default values (lowest priority)
10
+ */
11
+ import { existsSync, readFileSync } from 'fs';
12
+ import { join } from 'path';
13
+ import { homedir } from 'os';
14
+ let cachedConfig = null;
15
+ /**
16
+ * Get current CLI configuration
17
+ *
18
+ * Priority order:
19
+ * 1. REQUIRE_APPROVAL environment variable
20
+ * 2. .ecomcoder.json in current working directory
21
+ * 3. .ecomcoder.json in home directory
22
+ * 4. Default values (requireApproval: false)
23
+ *
24
+ * @returns Current configuration
25
+ *
26
+ * @example
27
+ * // Environment variable (highest priority)
28
+ * REQUIRE_APPROVAL=false ecomcoder product update-price --id=123 --price=29.99
29
+ *
30
+ * @example
31
+ * // Project-specific config
32
+ * echo '{"requireApproval": false}' > .ecomcoder.json
33
+ * ecomcoder product update-price --id=123 --price=29.99
34
+ *
35
+ * @example
36
+ * // Global user config
37
+ * echo '{"requireApproval": false}' > ~/.ecomcoder.json
38
+ * ecomcoder product update-price --id=123 --price=29.99
39
+ */
40
+ export function getConfig() {
41
+ // Return cached config if available
42
+ if (cachedConfig) {
43
+ return cachedConfig;
44
+ }
45
+ // Default configuration
46
+ let requireApproval = false;
47
+ // Priority 1: Check environment variable
48
+ if (process.env.REQUIRE_APPROVAL !== undefined) {
49
+ requireApproval = process.env.REQUIRE_APPROVAL !== 'false';
50
+ }
51
+ else {
52
+ // Priority 2 & 3: Check for config files
53
+ const configPaths = [
54
+ join(process.cwd(), '.ecomcoder.json'), // Current directory
55
+ join(homedir(), '.ecomcoder.json') // Home directory
56
+ ];
57
+ for (const configPath of configPaths) {
58
+ if (existsSync(configPath)) {
59
+ try {
60
+ const configData = JSON.parse(readFileSync(configPath, 'utf-8'));
61
+ if (configData.requireApproval !== undefined) {
62
+ requireApproval = configData.requireApproval;
63
+ break; // Use first found config file
64
+ }
65
+ }
66
+ catch (error) {
67
+ // Invalid JSON or read error, skip to next config file
68
+ continue;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ // Cache and return configuration
74
+ cachedConfig = { requireApproval };
75
+ return cachedConfig;
76
+ }
77
+ /**
78
+ * Clear cached configuration (useful for testing)
79
+ */
80
+ export function clearConfigCache() {
81
+ cachedConfig = null;
82
+ }
83
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAqB7B,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,SAAS;IACvB,oCAAoC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,wBAAwB;IACxB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,yCAAyC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC/C,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,MAAM,WAAW,GAAG;YAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,EAAY,oBAAoB;YACtE,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAgB,iBAAiB;SACpE,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,UAAU,GAAe,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC7E,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;wBAC7C,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;wBAC7C,MAAM,CAAC,8BAA8B;oBACvC,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,uDAAuD;oBACvD,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,YAAY,GAAG,EAAE,eAAe,EAAE,CAAC;IACnC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecomcoder-cli",
3
- "version": "1.3.12",
3
+ "version": "1.3.14",
4
4
  "type": "module",
5
5
  "description": "CLI tools for EcomCoder - Shopify development utilities",
6
6
  "main": "./dist/index.js",
@@ -54,6 +54,7 @@
54
54
  "form-data": "^4.0.0"
55
55
  },
56
56
  "devDependencies": {
57
+ "@types/form-data": "^2.2.1",
57
58
  "@types/node": "^20.10.0",
58
59
  "@vitest/coverage-v8": "^2.1.9",
59
60
  "tsx": "^4.21.0",