ecomcoder-cli 1.3.6 → 1.3.8

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.
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Update Product Options 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
+ Update Product Options
13
+
14
+ USAGE:
15
+ ecomcoder product update-options [OPTIONS]
16
+
17
+ REQUIRED OPTIONS:
18
+ --id <id> Product ID (numeric or GID format)
19
+ --option-id <id> Option ID to update (numeric or GID format)
20
+
21
+ OPTIONAL OPTIONS:
22
+ --name <name> New option name (rename)
23
+ --position <number> New position (1-3, reorder)
24
+ --add-values <json> JSON array of value names to add
25
+ --update-values <json> JSON array of value updates
26
+ --delete-values <json> JSON array of value IDs to remove
27
+ --variant-strategy <strategy> Variant creation strategy
28
+ Values: LEAVE_AS_IS (default), CREATE
29
+ --session-id <id> Session ID (auto-provided)
30
+ --help, -h Show this help message
31
+
32
+ VALUE UPDATE FORMAT (--update-values):
33
+ [
34
+ {"id": "gid://shopify/ProductOptionValue/123", "name": "NewName"}
35
+ ]
36
+
37
+ EXAMPLES:
38
+ # Rename option
39
+ ecomcoder product update-options \\
40
+ --id=123 \\
41
+ --option-id="gid://shopify/ProductOption/456" \\
42
+ --name="Tint"
43
+
44
+ # Add new values to existing option
45
+ ecomcoder product update-options \\
46
+ --id=123 \\
47
+ --option-id=456 \\
48
+ --add-values='["XXL","XXXL"]'
49
+
50
+ # Reorder option position
51
+ ecomcoder product update-options \\
52
+ --id=123 \\
53
+ --option-id=456 \\
54
+ --position=1
55
+
56
+ # Update existing value name
57
+ ecomcoder product update-options \\
58
+ --id=123 \\
59
+ --option-id=456 \\
60
+ --update-values='[{"id":"gid://shopify/ProductOptionValue/789","name":"Extra Large"}]'
61
+
62
+ # Delete option values
63
+ ecomcoder product update-options \\
64
+ --id=123 \\
65
+ --option-id=456 \\
66
+ --delete-values='["gid://shopify/ProductOptionValue/789"]'
67
+
68
+ # Combine multiple updates
69
+ ecomcoder product update-options \\
70
+ --id=123 \\
71
+ --option-id=456 \\
72
+ --name="Size" \\
73
+ --position=1 \\
74
+ --add-values='["XXL"]'
75
+
76
+ VARIANT STRATEGIES:
77
+ LEAVE_AS_IS Don't create variants automatically (default)
78
+ CREATE Auto-generate variants for new option values
79
+
80
+ NOTES:
81
+ - At least one update field (name, position, add/update/delete values) is required
82
+ - Position values must be sequential (1, 2, 3)
83
+ - Deleting option values may affect existing variants
84
+ - Option names must remain unique within the product
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.id) {
95
+ console.error(JSON.stringify({
96
+ success: false,
97
+ error: 'Missing required argument: --id'
98
+ }));
99
+ process.exit(1);
100
+ }
101
+ if (!args.optionId) {
102
+ console.error(JSON.stringify({
103
+ success: false,
104
+ error: 'Missing required argument: --option-id'
105
+ }));
106
+ process.exit(1);
107
+ }
108
+ // Validate at least one update field is provided
109
+ if (!args.name && !args.position && !args.addValues && !args.updateValues && !args.deleteValues) {
110
+ console.error(JSON.stringify({
111
+ success: false,
112
+ error: 'At least one update field is required (name, position, add-values, update-values, or delete-values)'
113
+ }));
114
+ process.exit(1);
115
+ }
116
+ try {
117
+ // Parse JSON fields if provided
118
+ let addValues;
119
+ let updateValues;
120
+ let deleteValues;
121
+ if (args.addValues) {
122
+ try {
123
+ addValues = JSON.parse(args.addValues);
124
+ if (!Array.isArray(addValues)) {
125
+ console.error(JSON.stringify({
126
+ success: false,
127
+ error: 'add-values must be a JSON array'
128
+ }));
129
+ process.exit(1);
130
+ }
131
+ }
132
+ catch (parseError) {
133
+ console.error(JSON.stringify({
134
+ success: false,
135
+ error: `Invalid add-values JSON format: ${parseError.message}`
136
+ }));
137
+ process.exit(1);
138
+ }
139
+ }
140
+ if (args.updateValues) {
141
+ try {
142
+ updateValues = JSON.parse(args.updateValues);
143
+ if (!Array.isArray(updateValues)) {
144
+ console.error(JSON.stringify({
145
+ success: false,
146
+ error: 'update-values must be a JSON array'
147
+ }));
148
+ process.exit(1);
149
+ }
150
+ // Validate each update value has required fields
151
+ for (let i = 0; i < updateValues.length; i++) {
152
+ if (!updateValues[i].id || !updateValues[i].name) {
153
+ console.error(JSON.stringify({
154
+ success: false,
155
+ error: `update-values at index ${i} must have 'id' and 'name' fields`
156
+ }));
157
+ process.exit(1);
158
+ }
159
+ }
160
+ }
161
+ catch (parseError) {
162
+ console.error(JSON.stringify({
163
+ success: false,
164
+ error: `Invalid update-values JSON format: ${parseError.message}`
165
+ }));
166
+ process.exit(1);
167
+ }
168
+ }
169
+ if (args.deleteValues) {
170
+ try {
171
+ deleteValues = JSON.parse(args.deleteValues);
172
+ if (!Array.isArray(deleteValues)) {
173
+ console.error(JSON.stringify({
174
+ success: false,
175
+ error: 'delete-values must be a JSON array'
176
+ }));
177
+ process.exit(1);
178
+ }
179
+ }
180
+ catch (parseError) {
181
+ console.error(JSON.stringify({
182
+ success: false,
183
+ error: `Invalid delete-values JSON format: ${parseError.message}`
184
+ }));
185
+ process.exit(1);
186
+ }
187
+ }
188
+ // Validate position if provided
189
+ if (args.position !== undefined) {
190
+ const position = parseInt(args.position, 10);
191
+ if (isNaN(position) || position < 1 || position > 3) {
192
+ console.error(JSON.stringify({
193
+ success: false,
194
+ error: 'Position must be a number between 1 and 3'
195
+ }));
196
+ process.exit(1);
197
+ }
198
+ }
199
+ // Validate variant strategy if provided
200
+ if (args.variantStrategy && !['LEAVE_AS_IS', 'CREATE'].includes(args.variantStrategy)) {
201
+ console.error(JSON.stringify({
202
+ success: false,
203
+ error: 'Invalid variant strategy. Must be LEAVE_AS_IS or CREATE'
204
+ }));
205
+ process.exit(1);
206
+ }
207
+ // Get credentials
208
+ const sessionId = getSessionId(args.sessionId);
209
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
210
+ // Execute via service
211
+ const result = await ProductService.updateOption(credentials, {
212
+ id: args.id,
213
+ optionId: args.optionId,
214
+ name: args.name,
215
+ position: args.position ? parseInt(args.position, 10) : undefined,
216
+ addValues,
217
+ updateValues,
218
+ deleteValues,
219
+ variantStrategy: args.variantStrategy
220
+ });
221
+ // Output result
222
+ console.log(JSON.stringify(result, null, 2));
223
+ if (!result.success) {
224
+ process.exit(1);
225
+ }
226
+ }
227
+ catch (error) {
228
+ console.error(JSON.stringify({
229
+ success: false,
230
+ error: error.message || 'Unknown error occurred'
231
+ }));
232
+ process.exit(1);
233
+ }
234
+ }
235
+ //# sourceMappingURL=update-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-options.js","sourceRoot":"","sources":["../../../src/commands/product/update-options.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.6",
3
+ "version": "1.3.8",
4
4
  "type": "module",
5
5
  "description": "CLI tools for EcomCoder - Shopify development utilities",
6
6
  "main": "./dist/index.js",
@@ -49,8 +49,7 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@pinecone-database/pinecone": "^6.1.3",
52
- "@supabase/supabase-js": "^2.87.0",
53
- "ecomcoder-cli": "^1.2.12"
52
+ "@supabase/supabase-js": "^2.87.0"
54
53
  },
55
54
  "devDependencies": {
56
55
  "@types/node": "^20.10.0",