ecomcoder-cli 1.3.2 → 1.3.4

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 (73) hide show
  1. package/README.md +0 -23
  2. package/dist/cli.js +32 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/product/__tests__/update-description.test.js +1 -0
  5. package/dist/commands/product/__tests__/update-description.test.js.map +1 -1
  6. package/dist/commands/product/create-variants.d.ts +8 -0
  7. package/dist/commands/product/create-variants.d.ts.map +1 -0
  8. package/dist/commands/product/create-variants.js +160 -0
  9. package/dist/commands/product/create-variants.js.map +1 -0
  10. package/dist/commands/product/create.d.ts +8 -0
  11. package/dist/commands/product/create.d.ts.map +1 -0
  12. package/dist/commands/product/create.js +166 -0
  13. package/dist/commands/product/create.js.map +1 -0
  14. package/dist/commands/product/delete-variants.d.ts +8 -0
  15. package/dist/commands/product/delete-variants.d.ts.map +1 -0
  16. package/dist/commands/product/delete-variants.js +105 -0
  17. package/dist/commands/product/delete-variants.js.map +1 -0
  18. package/dist/commands/product/get-metafield.d.ts +8 -0
  19. package/dist/commands/product/get-metafield.d.ts.map +1 -0
  20. package/dist/commands/product/get-metafield.js +131 -0
  21. package/dist/commands/product/get-metafield.js.map +1 -0
  22. package/dist/commands/product/index.d.ts.map +1 -1
  23. package/dist/commands/product/index.js +62 -0
  24. package/dist/commands/product/index.js.map +1 -1
  25. package/dist/commands/product/queries.d.ts +31 -2
  26. package/dist/commands/product/queries.d.ts.map +1 -1
  27. package/dist/commands/product/queries.js +184 -0
  28. package/dist/commands/product/queries.js.map +1 -1
  29. package/dist/commands/product/service.d.ts +67 -1
  30. package/dist/commands/product/service.d.ts.map +1 -1
  31. package/dist/commands/product/service.js +363 -1
  32. package/dist/commands/product/service.js.map +1 -1
  33. package/dist/commands/product/set-metafield.d.ts +8 -0
  34. package/dist/commands/product/set-metafield.d.ts.map +1 -0
  35. package/dist/commands/product/set-metafield.js +174 -0
  36. package/dist/commands/product/set-metafield.js.map +1 -0
  37. package/dist/commands/product/types.d.ts +162 -0
  38. package/dist/commands/product/types.d.ts.map +1 -1
  39. package/dist/commands/product/update-status.d.ts +8 -0
  40. package/dist/commands/product/update-status.d.ts.map +1 -0
  41. package/dist/commands/product/update-status.js +105 -0
  42. package/dist/commands/product/update-status.js.map +1 -0
  43. package/dist/commands/product/utils.d.ts.map +1 -1
  44. package/dist/commands/product/utils.js +1 -0
  45. package/dist/commands/product/utils.js.map +1 -1
  46. package/dist/commands/products/index.d.ts.map +1 -1
  47. package/dist/commands/products/index.js +0 -10
  48. package/dist/commands/products/index.js.map +1 -1
  49. package/dist/commands/shop/get-metafield.d.ts +8 -0
  50. package/dist/commands/shop/get-metafield.d.ts.map +1 -0
  51. package/dist/commands/shop/get-metafield.js +117 -0
  52. package/dist/commands/shop/get-metafield.js.map +1 -0
  53. package/dist/commands/shop/index.d.ts +10 -0
  54. package/dist/commands/shop/index.d.ts.map +1 -0
  55. package/dist/commands/shop/index.js +61 -0
  56. package/dist/commands/shop/index.js.map +1 -0
  57. package/dist/commands/shop/queries.d.ts +24 -0
  58. package/dist/commands/shop/queries.d.ts.map +1 -0
  59. package/dist/commands/shop/queries.js +83 -0
  60. package/dist/commands/shop/queries.js.map +1 -0
  61. package/dist/commands/shop/service.d.ts +30 -0
  62. package/dist/commands/shop/service.d.ts.map +1 -0
  63. package/dist/commands/shop/service.js +131 -0
  64. package/dist/commands/shop/service.js.map +1 -0
  65. package/dist/commands/shop/set-metafield.d.ts +8 -0
  66. package/dist/commands/shop/set-metafield.d.ts.map +1 -0
  67. package/dist/commands/shop/set-metafield.js +174 -0
  68. package/dist/commands/shop/set-metafield.js.map +1 -0
  69. package/dist/commands/shop/types.d.ts +84 -0
  70. package/dist/commands/shop/types.d.ts.map +1 -0
  71. package/dist/commands/shop/types.js +6 -0
  72. package/dist/commands/shop/types.js.map +1 -0
  73. package/package.json +1 -1
package/README.md CHANGED
@@ -53,22 +53,6 @@ ecomcoder products list --limit=50
53
53
  **Options:**
54
54
  - `--limit` - Maximum number of products to retrieve (default: 50)
55
55
 
56
- #### Set Product Rating
57
-
58
- Add rating metafields to a product (useful for testing review systems).
59
-
60
- ```bash
61
- ecomcoder products set-rating \
62
- --product-id="gid://shopify/Product/123456789" \
63
- --rating=4.5 \
64
- --count=127
65
- ```
66
-
67
- **Options:**
68
- - `--product-id` - Shopify product GID
69
- - `--rating` - Rating value (e.g., 4.5)
70
- - `--count` - Number of reviews/ratings
71
-
72
56
  ### Metafields
73
57
 
74
58
  #### Create Metafield Definition
@@ -173,7 +157,6 @@ ecomcoder-cli/
173
157
  │ ├── commands/ # Command implementations
174
158
  │ │ ├── create-dummy-products.ts
175
159
  │ │ ├── list-products.ts
176
- │ │ ├── set-product-rating.ts
177
160
  │ │ ├── create-metafield.ts
178
161
  │ │ ├── get-metafield.ts
179
162
  │ │ └── docs-search.ts
@@ -253,12 +236,6 @@ ecomcoder products create --count=25
253
236
  # List all products (up to 100)
254
237
  ecomcoder products list --limit=100
255
238
 
256
- # Add a 4.8 star rating with 243 reviews
257
- ecomcoder products set-rating \
258
- --product-id="gid://shopify/Product/8234567890" \
259
- --rating=4.8 \
260
- --count=243
261
-
262
239
  # Create a shop-level recommended products metafield
263
240
  ecomcoder metafield create \
264
241
  --name="Recommended Products" \
package/dist/cli.js CHANGED
@@ -14,12 +14,14 @@ import { getPositionalArgs } from './lib/args-parser.js';
14
14
  import { registry } from './lib/command-registry.js';
15
15
  // Register all command groups
16
16
  import { registerProductCommands } from './commands/product/index.js';
17
+ import { registerShopCommands } from './commands/shop/index.js';
17
18
  import { registerMetafieldCommands } from './commands/metafield/index.js';
18
19
  import { registerProductsCommands } from './commands/products/index.js';
19
20
  import { registerDocsCommands } from './commands/docs/index.js';
20
21
  import { registerDiscountCommands } from './commands/discount/index.js';
21
22
  // Initialize registry
22
23
  registerProductCommands();
24
+ registerShopCommands();
23
25
  registerMetafieldCommands();
24
26
  registerProductsCommands();
25
27
  registerDocsCommands();
@@ -34,12 +36,21 @@ USAGE:
34
36
  COMMANDS:
35
37
  products create Create dummy Shopify products for testing
36
38
  products list List products in your Shopify store
37
- products set-rating Set rating metafields on a product
39
+ product create Create a new product from scratch
38
40
  product get Get detailed product data
41
+ product set-metafield Set or update product metafield values
42
+ product update-title Update product title
39
43
  product update-description Update product description
40
44
  product update-price Update product price and compare-at price
45
+ product update-status Update product status (ACTIVE, DRAFT, ARCHIVED)
41
46
  product update-template Change product template assignment
47
+ product create-variants Create product variants (bulk operation)
48
+ product delete-variants Delete product variants (bulk operation)
49
+ shop set-metafield Set or update shop metafield values (store-wide)
50
+ shop get-metafield View shop metafield values (store-wide)
42
51
  discount create-basic Create basic discount (percentage or fixed amount)
52
+ discount create-bxgy Create BXGY (Buy X Get Y) discount
53
+ discount create-shipping Create free shipping discount
43
54
  discount list List all discounts with filtering
44
55
  discount delete Delete a discount by ID
45
56
  metafield create Create metafield definition
@@ -64,22 +75,38 @@ EXAMPLES:
64
75
  # List 50 products
65
76
  ecomcoder products list --limit=50
66
77
 
67
- # Set product rating
68
- ecomcoder products set-rating --product-id="gid://shopify/Product/123" --rating=4.5 --count=127
78
+ # Create a new product
79
+ ecomcoder product create --title="Premium Hair Serum" --price=29.99 --sku="HAIR-001"
69
80
 
70
81
  # Get product details
71
82
  ecomcoder product get --id=123456789
72
83
  ecomcoder product get --title="Blue T-Shirt"
73
84
 
85
+ # Set product metafield (AI bundle automation)
86
+ ecomcoder product set-metafield --id=123 --namespace=bundles --key=products \\
87
+ --value='["gid://shopify/Product/456"]' --type=list.product_reference
88
+
89
+ # Update product title
90
+ ecomcoder product update-title --id=123 --title="Premium Hair Serum"
91
+
74
92
  # Update product description
75
93
  ecomcoder product update-description --id=123 --description="Premium cotton t-shirt"
76
94
 
77
- # Update product price
78
- ecomcoder product update-price --id=123 --price=34.99 --compare-at-price=49.99
95
+ # Update product price (all variants)
96
+ ecomcoder product update-price --id=123 --price=34.99 --compare-at-price=49.99 --all-variants
97
+
98
+ # Update product status
99
+ ecomcoder product update-status --id=123 --status=ACTIVE
79
100
 
80
101
  # Change product template
81
102
  ecomcoder product update-template --id=123 --template=premium
82
103
 
104
+ # Create product variants
105
+ ecomcoder product create-variants --product-id=123 --variants='[{"price":"29.99","inventoryItem":{"sku":"TEST-001"}}]'
106
+
107
+ # Delete product variants
108
+ ecomcoder product delete-variants --product-id=123 --variant-ids="456,789"
109
+
83
110
  # Create product-level metafield
84
111
  ecomcoder metafield create --name="Rating" --key=rating --type=number_decimal --owner-type=PRODUCT
85
112
 
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ const mockFormattedProduct = {
24
24
  vendor: 'Test Vendor',
25
25
  template: 'product',
26
26
  tags: ['test'],
27
+ options: [],
27
28
  priceRange: {
28
29
  min: { amount: '29.99', currencyCode: 'USD' },
29
30
  max: { amount: '29.99', currencyCode: 'USD' }
@@ -1 +1 @@
1
- {"version":3,"file":"update-description.test.js","sourceRoot":"","sources":["../../../../src/commands/product/__tests__/update-description.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-description.test.js","sourceRoot":"","sources":["../../../../src/commands/product/__tests__/update-description.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Create Product Variants Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=create-variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-variants.d.ts","sourceRoot":"","sources":["../../../src/commands/product/create-variants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsFH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBA8E/D"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Create Product Variants 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
+ function showHelp() {
11
+ console.log(`
12
+ Create Product Variants
13
+
14
+ USAGE:
15
+ ecomcoder product create-variants [OPTIONS]
16
+
17
+ OPTIONS:
18
+ --product-id <id> Product ID (required)
19
+ --variants <json> JSON array of variant objects (required)
20
+ --session-id Session ID (auto-provided via SESSION_ID env var)
21
+ --help, -h Show this help message
22
+
23
+ VARIANT OBJECT FORMAT:
24
+ {
25
+ "price": "29.99", // Required: Variant price
26
+ "compareAtPrice": "39.99", // Optional: Original/sale price
27
+ "barcode": "123456789", // Optional: Product barcode
28
+ "optionValues": [ // Optional: Option values (Size, Color, etc.)
29
+ { "optionName": "Size", "name": "Medium" },
30
+ { "optionName": "Color", "name": "Blue" }
31
+ ],
32
+ "inventoryItem": { // Optional: Inventory settings
33
+ "sku": "SHIRT-BLU-M", // SKU (must be in inventoryItem)
34
+ "tracked": true // Track inventory (default: false)
35
+ },
36
+ "inventoryQuantities": [ // Optional: Set initial inventory
37
+ {
38
+ "availableQuantity": 100,
39
+ "locationId": "gid://shopify/Location/123"
40
+ }
41
+ ],
42
+ "taxable": true // Optional: Tax applicability (default: true)
43
+ }
44
+
45
+ EXAMPLES:
46
+ # Create single variant
47
+ ecomcoder product create-variants \\
48
+ --product-id=123456789 \\
49
+ --variants='[{"price":"29.99","inventoryItem":{"sku":"TEST-001"}}]'
50
+
51
+ # Create multiple size variants
52
+ ecomcoder product create-variants \\
53
+ --product-id="gid://shopify/Product/123" \\
54
+ --variants='[
55
+ {"price":"29.99","inventoryItem":{"sku":"SHIRT-S"},"optionValues":[{"optionName":"Size","name":"Small"}]},
56
+ {"price":"29.99","inventoryItem":{"sku":"SHIRT-M"},"optionValues":[{"optionName":"Size","name":"Medium"}]},
57
+ {"price":"29.99","inventoryItem":{"sku":"SHIRT-L"},"optionValues":[{"optionName":"Size","name":"Large"}]}
58
+ ]'
59
+
60
+ # Create variant with sale pricing
61
+ ecomcoder product create-variants \\
62
+ --product-id=123 \\
63
+ --variants='[{"price":"24.99","compareAtPrice":"39.99","inventoryItem":{"sku":"SALE-001"}}]'
64
+
65
+ # Create variant with inventory tracking
66
+ ecomcoder product create-variants \\
67
+ --product-id=123 \\
68
+ --variants='[{
69
+ "price":"29.99",
70
+ "inventoryItem":{"sku":"INV-001","tracked":true},
71
+ "inventoryQuantities":[{"availableQuantity":100,"locationId":"gid://shopify/Location/123"}]
72
+ }]'
73
+
74
+ IMPORTANT RESTRICTIONS:
75
+ - Maximum 2,048 variants per product
76
+ - SKU must be unique across all products (if provided)
77
+ - Option values must match product's existing option names
78
+ - Cannot create variants for products with no options defined
79
+
80
+ NOTES:
81
+ - Use JSON array format for variants (can be single or multiple)
82
+ - Option names are case-sensitive
83
+ - First variant of a product doesn't need option values
84
+ - Inventory tracking requires valid location ID
85
+ `);
86
+ process.exit(0);
87
+ }
88
+ export async function run(argv = process.argv.slice(2)) {
89
+ if (hasHelpFlag(argv)) {
90
+ showHelp();
91
+ }
92
+ const args = parseArgs(argv);
93
+ // Validate required arguments
94
+ if (!args.productId) {
95
+ console.error(JSON.stringify({
96
+ success: false,
97
+ error: 'Missing required argument: --product-id'
98
+ }));
99
+ process.exit(1);
100
+ }
101
+ if (!args.variants) {
102
+ console.error(JSON.stringify({
103
+ success: false,
104
+ error: 'Missing required argument: --variants'
105
+ }));
106
+ process.exit(1);
107
+ }
108
+ try {
109
+ // Parse variants JSON
110
+ let variants;
111
+ try {
112
+ variants = JSON.parse(args.variants);
113
+ if (!Array.isArray(variants)) {
114
+ console.error(JSON.stringify({
115
+ success: false,
116
+ error: 'Variants must be a JSON array'
117
+ }));
118
+ process.exit(1);
119
+ }
120
+ }
121
+ catch (parseError) {
122
+ console.error(JSON.stringify({
123
+ success: false,
124
+ error: `Invalid JSON format: ${parseError.message}`
125
+ }));
126
+ process.exit(1);
127
+ }
128
+ // Validate each variant has required price field
129
+ for (let i = 0; i < variants.length; i++) {
130
+ if (!variants[i].price) {
131
+ console.error(JSON.stringify({
132
+ success: false,
133
+ error: `Variant at index ${i} is missing required field: price`
134
+ }));
135
+ process.exit(1);
136
+ }
137
+ }
138
+ // Get credentials
139
+ const sessionId = getSessionId(args.sessionId);
140
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
141
+ // Execute create via service
142
+ const result = await ProductService.createVariants(credentials, {
143
+ productId: args.productId,
144
+ variants
145
+ });
146
+ // Output result
147
+ console.log(JSON.stringify(result, null, 2));
148
+ if (!result.success) {
149
+ process.exit(1);
150
+ }
151
+ }
152
+ catch (error) {
153
+ console.error(JSON.stringify({
154
+ success: false,
155
+ error: error.message || 'Unknown error occurred'
156
+ }));
157
+ process.exit(1);
158
+ }
159
+ }
160
+ //# sourceMappingURL=create-variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-variants.js","sourceRoot":"","sources":["../../../src/commands/product/create-variants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Create Product Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/product/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBAiH/D"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Create Product 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
+ function showHelp() {
11
+ console.log(`
12
+ Create Product
13
+
14
+ USAGE:
15
+ ecomcoder product create [OPTIONS]
16
+
17
+ REQUIRED OPTIONS:
18
+ --title <text> Product title (required)
19
+
20
+ OPTIONAL:
21
+ --description <text> Product description (HTML supported)
22
+ --price <amount> Initial variant price
23
+ --compare-at-price <amount> Sale/original price
24
+ --sku <sku> SKU for initial variant
25
+ --product-type <type> Product type/category
26
+ --vendor <name> Product vendor/brand
27
+ --status <status> Product status: ACTIVE, DRAFT, or ARCHIVED (default: DRAFT)
28
+ --handle <handle> URL slug (auto-generated from title if not provided)
29
+ --tags <tags> Comma-separated tags
30
+ --session-id Session ID (auto-provided via SESSION_ID env var)
31
+ --help, -h Show this help message
32
+
33
+ EXAMPLES:
34
+ # Minimal product (title only)
35
+ ecomcoder product create --title="Premium Hair Serum"
36
+
37
+ # Product with pricing
38
+ ecomcoder product create \\
39
+ --title="Premium Hair Serum" \\
40
+ --price=29.99 \\
41
+ --compare-at-price=44.95 \\
42
+ --sku="HAIR-001"
43
+
44
+ # Complete product
45
+ ecomcoder product create \\
46
+ --title="Therapy Hair Serum - Natural Formula" \\
47
+ --description="<h2>Premium Formula</h2><p>Natural ingredients for healthy hair</p>" \\
48
+ --price=34.99 \\
49
+ --sku="HAIR-SERUM-001" \\
50
+ --product-type="Hair Care" \\
51
+ --vendor="Beauty Co" \\
52
+ --status=ACTIVE \\
53
+ --tags="natural,organic,hair-care"
54
+
55
+ # Draft product (for review before publishing)
56
+ ecomcoder product create \\
57
+ --title="New Product Launch" \\
58
+ --status=DRAFT
59
+
60
+ IMPORTANT NOTES:
61
+ ⚠️ Inventory Setup Required: Created products start with 0 inventory.
62
+ You must set inventory quantities in Shopify Admin:
63
+ Products → [Product Name] → Variants → Edit inventory
64
+
65
+ ⚠️ Single Variant: Creates only 1 initial variant.
66
+ Use 'product create-variants' to add more variants.
67
+
68
+ ⚠️ No Images: Product images must be added separately.
69
+ `);
70
+ process.exit(0);
71
+ }
72
+ export async function run(argv = process.argv.slice(2)) {
73
+ if (hasHelpFlag(argv)) {
74
+ showHelp();
75
+ }
76
+ const args = parseArgs(argv);
77
+ // Validate required argument
78
+ if (!args.title) {
79
+ console.error(JSON.stringify({
80
+ success: false,
81
+ error: 'Missing required argument: --title'
82
+ }));
83
+ process.exit(1);
84
+ }
85
+ // Validate title is not empty
86
+ if (typeof args.title === 'string' && args.title.trim() === '') {
87
+ console.error(JSON.stringify({
88
+ success: false,
89
+ error: 'Title cannot be empty'
90
+ }));
91
+ process.exit(1);
92
+ }
93
+ // Validate status if provided
94
+ const validStatuses = ['ACTIVE', 'DRAFT', 'ARCHIVED'];
95
+ if (args.status && !validStatuses.includes(args.status.toUpperCase())) {
96
+ console.error(JSON.stringify({
97
+ success: false,
98
+ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}`
99
+ }));
100
+ process.exit(1);
101
+ }
102
+ try {
103
+ // Get credentials
104
+ const sessionId = getSessionId(args.sessionId);
105
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
106
+ // Build input object
107
+ const input = {
108
+ title: args.title.trim()
109
+ };
110
+ // Add optional fields
111
+ if (args.description) {
112
+ input.descriptionHtml = args.description;
113
+ }
114
+ if (args.productType) {
115
+ input.productType = args.productType;
116
+ }
117
+ if (args.vendor) {
118
+ input.vendor = args.vendor;
119
+ }
120
+ if (args.status) {
121
+ input.status = args.status.toUpperCase();
122
+ }
123
+ if (args.handle) {
124
+ input.handle = args.handle;
125
+ }
126
+ if (args.tags) {
127
+ input.tags = args.tags.split(',').map((tag) => tag.trim());
128
+ }
129
+ // Build initial variant if price or SKU provided
130
+ // Service layer will update the variant after product creation
131
+ if (args.price || args.sku || args.compareAtPrice) {
132
+ const variant = {};
133
+ if (args.price) {
134
+ variant.price = args.price;
135
+ }
136
+ if (args.compareAtPrice) {
137
+ variant.compareAtPrice = args.compareAtPrice;
138
+ }
139
+ if (args.sku) {
140
+ variant.inventoryItem = {
141
+ sku: args.sku
142
+ };
143
+ }
144
+ input.variants = [variant];
145
+ }
146
+ // Execute create via service
147
+ const result = await ProductService.createProduct(credentials, input);
148
+ // Output result
149
+ console.log(JSON.stringify(result, null, 2));
150
+ // Show inventory warning if successful
151
+ if (result.success) {
152
+ console.error('\n⚠️ IMPORTANT: Product created with 0 inventory. Set inventory quantities in Shopify Admin.\n');
153
+ }
154
+ if (!result.success) {
155
+ process.exit(1);
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.error(JSON.stringify({
160
+ success: false,
161
+ error: error.message || 'Unknown error occurred'
162
+ }));
163
+ process.exit(1);
164
+ }
165
+ }
166
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/product/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Db,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,6BAA6B;IAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,oCAAoC;SAC5C,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB;SAC/B,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mCAAmC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACrE,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAE/E,qBAAqB;QACrB,MAAM,KAAK,GAAQ;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;SACzB,CAAC;QAEF,sBAAsB;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3C,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,iDAAiD;QACjD,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAClD,MAAM,OAAO,GAAQ,EAAE,CAAC;YAExB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC7B,CAAC;YAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC/C,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,aAAa,GAAG;oBACtB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEtE,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7C,uCAAuC;QACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACnH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,wBAAwB;SACjD,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Delete Product Variants Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ProductService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=delete-variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-variants.d.ts","sourceRoot":"","sources":["../../../src/commands/product/delete-variants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkDH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBA2D/D"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Delete Product Variants 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
+ function showHelp() {
11
+ console.log(`
12
+ Delete Product Variants
13
+
14
+ USAGE:
15
+ ecomcoder product delete-variants [OPTIONS]
16
+
17
+ OPTIONS:
18
+ --product-id <id> Product ID (required)
19
+ --variant-ids <ids> Comma-separated variant IDs to delete (required)
20
+ --session-id Session ID (auto-provided via SESSION_ID env var)
21
+ --help, -h Show this help message
22
+
23
+ EXAMPLES:
24
+ # Delete single variant
25
+ ecomcoder product delete-variants \
26
+ --product-id=123456789 \
27
+ --variant-ids="gid://shopify/ProductVariant/987654321"
28
+
29
+ # Delete multiple variants
30
+ ecomcoder product delete-variants \
31
+ --product-id="gid://shopify/Product/123456789" \
32
+ --variant-ids="gid://shopify/ProductVariant/111,gid://shopify/ProductVariant/222"
33
+
34
+ # Delete using numeric IDs
35
+ ecomcoder product delete-variants \
36
+ --product-id=123 \
37
+ --variant-ids="456,789"
38
+
39
+ IMPORTANT RESTRICTIONS:
40
+ - Cannot delete the last variant of a product (every product must have at least one variant)
41
+ - All variant IDs must belong to the specified product
42
+ - Cannot delete variants associated with active or unfulfilled orders
43
+ - Deletion is permanent - inventory data will be lost
44
+
45
+ NOTES:
46
+ - Deleted variants cannot be recovered
47
+ - Existing orders are NOT affected (historical data preserved)
48
+ - Inventory for deleted variants is permanently removed
49
+ - Use comma-separated list for multiple variants (no spaces)
50
+ `);
51
+ process.exit(0);
52
+ }
53
+ export async function run(argv = process.argv.slice(2)) {
54
+ if (hasHelpFlag(argv)) {
55
+ showHelp();
56
+ }
57
+ const args = parseArgs(argv);
58
+ // Validate required arguments
59
+ if (!args.productId) {
60
+ console.error(JSON.stringify({
61
+ success: false,
62
+ error: 'Missing required argument: --product-id'
63
+ }));
64
+ process.exit(1);
65
+ }
66
+ if (!args.variantIds) {
67
+ console.error(JSON.stringify({
68
+ success: false,
69
+ error: 'Missing required argument: --variant-ids'
70
+ }));
71
+ process.exit(1);
72
+ }
73
+ try {
74
+ // Parse variant IDs from comma-separated string
75
+ const variantIds = args.variantIds.split(',').map((id) => id.trim()).filter(Boolean);
76
+ if (variantIds.length === 0) {
77
+ console.error(JSON.stringify({
78
+ success: false,
79
+ error: 'No valid variant IDs provided'
80
+ }));
81
+ process.exit(1);
82
+ }
83
+ // Get credentials
84
+ const sessionId = getSessionId(args.sessionId);
85
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
86
+ // Execute delete via service
87
+ const result = await ProductService.deleteVariants(credentials, {
88
+ productId: args.productId,
89
+ variantIds
90
+ });
91
+ // Output result
92
+ console.log(JSON.stringify(result, null, 2));
93
+ if (!result.success) {
94
+ process.exit(1);
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error(JSON.stringify({
99
+ success: false,
100
+ error: error.message || 'Unknown error occurred'
101
+ }));
102
+ process.exit(1);
103
+ }
104
+ }
105
+ //# sourceMappingURL=delete-variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-variants.js","sourceRoot":"","sources":["../../../src/commands/product/delete-variants.ts"],"names":[],"mappings":"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"}