ecomcoder-cli 1.3.3 → 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 (60) hide show
  1. package/README.md +0 -23
  2. package/dist/cli.js +16 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/product/create.d.ts +8 -0
  5. package/dist/commands/product/create.d.ts.map +1 -0
  6. package/dist/commands/product/create.js +166 -0
  7. package/dist/commands/product/create.js.map +1 -0
  8. package/dist/commands/product/get-metafield.d.ts +8 -0
  9. package/dist/commands/product/get-metafield.d.ts.map +1 -0
  10. package/dist/commands/product/get-metafield.js +131 -0
  11. package/dist/commands/product/get-metafield.js.map +1 -0
  12. package/dist/commands/product/index.d.ts.map +1 -1
  13. package/dist/commands/product/index.js +42 -0
  14. package/dist/commands/product/index.js.map +1 -1
  15. package/dist/commands/product/queries.d.ts +19 -0
  16. package/dist/commands/product/queries.d.ts.map +1 -1
  17. package/dist/commands/product/queries.js +122 -0
  18. package/dist/commands/product/queries.js.map +1 -1
  19. package/dist/commands/product/service.d.ts +35 -1
  20. package/dist/commands/product/service.d.ts.map +1 -1
  21. package/dist/commands/product/service.js +241 -1
  22. package/dist/commands/product/service.js.map +1 -1
  23. package/dist/commands/product/set-metafield.d.ts +8 -0
  24. package/dist/commands/product/set-metafield.d.ts.map +1 -0
  25. package/dist/commands/product/set-metafield.js +174 -0
  26. package/dist/commands/product/set-metafield.js.map +1 -0
  27. package/dist/commands/product/types.d.ts +88 -0
  28. package/dist/commands/product/types.d.ts.map +1 -1
  29. package/dist/commands/product/update-status.d.ts +8 -0
  30. package/dist/commands/product/update-status.d.ts.map +1 -0
  31. package/dist/commands/product/update-status.js +105 -0
  32. package/dist/commands/product/update-status.js.map +1 -0
  33. package/dist/commands/products/index.d.ts.map +1 -1
  34. package/dist/commands/products/index.js +0 -10
  35. package/dist/commands/products/index.js.map +1 -1
  36. package/dist/commands/shop/get-metafield.d.ts +8 -0
  37. package/dist/commands/shop/get-metafield.d.ts.map +1 -0
  38. package/dist/commands/shop/get-metafield.js +117 -0
  39. package/dist/commands/shop/get-metafield.js.map +1 -0
  40. package/dist/commands/shop/index.d.ts +10 -0
  41. package/dist/commands/shop/index.d.ts.map +1 -0
  42. package/dist/commands/shop/index.js +61 -0
  43. package/dist/commands/shop/index.js.map +1 -0
  44. package/dist/commands/shop/queries.d.ts +24 -0
  45. package/dist/commands/shop/queries.d.ts.map +1 -0
  46. package/dist/commands/shop/queries.js +83 -0
  47. package/dist/commands/shop/queries.js.map +1 -0
  48. package/dist/commands/shop/service.d.ts +30 -0
  49. package/dist/commands/shop/service.d.ts.map +1 -0
  50. package/dist/commands/shop/service.js +131 -0
  51. package/dist/commands/shop/service.js.map +1 -0
  52. package/dist/commands/shop/set-metafield.d.ts +8 -0
  53. package/dist/commands/shop/set-metafield.d.ts.map +1 -0
  54. package/dist/commands/shop/set-metafield.js +174 -0
  55. package/dist/commands/shop/set-metafield.js.map +1 -0
  56. package/dist/commands/shop/types.d.ts +84 -0
  57. package/dist/commands/shop/types.d.ts.map +1 -0
  58. package/dist/commands/shop/types.js +6 -0
  59. package/dist/commands/shop/types.js.map +1 -0
  60. package/package.json +1 -1
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shop Commands Registration
3
+ *
4
+ * Following Open/Closed Principle - commands register themselves
5
+ */
6
+ import { registry } from '../../lib/command-registry.js';
7
+ /**
8
+ * Register all shop commands
9
+ */
10
+ export function registerShopCommands() {
11
+ // Register command group
12
+ registry.registerGroup({
13
+ command: 'shop',
14
+ description: 'Manage shop-level (store-wide) settings and metafields',
15
+ showHelp: () => {
16
+ console.log(`
17
+ Shop Commands - Manage store-wide settings and metafields
18
+
19
+ USAGE:
20
+ ecomcoder shop <subcommand> [options]
21
+
22
+ SUBCOMMANDS:
23
+ set-metafield Set or update shop metafield values
24
+ get-metafield View shop metafield values
25
+
26
+ EXAMPLES:
27
+ # Set store-wide announcement
28
+ ecomcoder shop set-metafield --namespace=custom --key=announcement --value="Sale!" --type=single_line_text_field
29
+
30
+ # Get announcement metafield
31
+ ecomcoder shop get-metafield --namespace=custom --key=announcement
32
+
33
+ # Get all metafields in 'custom' namespace
34
+ ecomcoder shop get-metafield --namespace=custom
35
+
36
+ # Set free shipping threshold
37
+ ecomcoder shop set-metafield --namespace=shipping --key=min_amount --value="50.00" --type=number_decimal
38
+
39
+ # Set featured products (global)
40
+ ecomcoder shop set-metafield --namespace=products --key=featured --value='["gid://shopify/Product/123"]' --type=list.product_reference
41
+
42
+ For detailed help on a specific subcommand:
43
+ ecomcoder shop <subcommand> --help
44
+ `);
45
+ }
46
+ });
47
+ // Register individual subcommands
48
+ registry.register({
49
+ command: 'shop',
50
+ subcommand: 'set-metafield',
51
+ description: 'Set or update shop metafield values',
52
+ handler: async () => await import('./set-metafield.js')
53
+ });
54
+ registry.register({
55
+ command: 'shop',
56
+ subcommand: 'get-metafield',
57
+ description: 'View shop metafield values',
58
+ handler: async () => await import('./get-metafield.js')
59
+ });
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/shop/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,yBAAyB;IACzB,QAAQ,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjB,CAAC,CAAC;QACC,CAAC;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC;KACxD,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC;QAChB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC;KACxD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * GraphQL Queries and Mutations for Shop Operations
3
+ *
4
+ * Following Single Responsibility Principle - this module only contains GraphQL strings
5
+ */
6
+ /**
7
+ * Get shop ID (needed for metafield mutations)
8
+ */
9
+ export declare const GET_SHOP_ID = "\n query getShopId {\n shop {\n id\n }\n }\n";
10
+ /**
11
+ * Get specific shop metafield by namespace and key
12
+ */
13
+ export declare const GET_SHOP_METAFIELD = "\n query getShopMetafield($namespace: String!, $key: String!) {\n shop {\n id\n metafield(namespace: $namespace, key: $key) {\n id\n namespace\n key\n value\n type\n createdAt\n updatedAt\n }\n }\n }\n";
14
+ /**
15
+ * Get shop metafields (multiple)
16
+ * Used for querying all metafields or by namespace
17
+ */
18
+ export declare const GET_SHOP_METAFIELDS = "\n query getShopMetafields($namespace: String, $first: Int) {\n shop {\n id\n metafields(namespace: $namespace, first: $first) {\n edges {\n node {\n id\n namespace\n key\n value\n type\n createdAt\n updatedAt\n }\n }\n }\n }\n }\n";
19
+ /**
20
+ * Set metafield values for shop
21
+ * Maximum 25 metafields per request, atomic operation
22
+ */
23
+ export declare const METAFIELDS_SET = "\n mutation metafieldsSet($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields {\n id\n namespace\n key\n value\n type\n createdAt\n updatedAt\n }\n userErrors {\n field\n message\n code\n }\n }\n }\n";
24
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/commands/shop/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,8DAMvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,sRAe9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gXAmB/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,yVAmB1B,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * GraphQL Queries and Mutations for Shop Operations
3
+ *
4
+ * Following Single Responsibility Principle - this module only contains GraphQL strings
5
+ */
6
+ /**
7
+ * Get shop ID (needed for metafield mutations)
8
+ */
9
+ export const GET_SHOP_ID = `
10
+ query getShopId {
11
+ shop {
12
+ id
13
+ }
14
+ }
15
+ `;
16
+ /**
17
+ * Get specific shop metafield by namespace and key
18
+ */
19
+ export const GET_SHOP_METAFIELD = `
20
+ query getShopMetafield($namespace: String!, $key: String!) {
21
+ shop {
22
+ id
23
+ metafield(namespace: $namespace, key: $key) {
24
+ id
25
+ namespace
26
+ key
27
+ value
28
+ type
29
+ createdAt
30
+ updatedAt
31
+ }
32
+ }
33
+ }
34
+ `;
35
+ /**
36
+ * Get shop metafields (multiple)
37
+ * Used for querying all metafields or by namespace
38
+ */
39
+ export const GET_SHOP_METAFIELDS = `
40
+ query getShopMetafields($namespace: String, $first: Int) {
41
+ shop {
42
+ id
43
+ metafields(namespace: $namespace, first: $first) {
44
+ edges {
45
+ node {
46
+ id
47
+ namespace
48
+ key
49
+ value
50
+ type
51
+ createdAt
52
+ updatedAt
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ `;
59
+ /**
60
+ * Set metafield values for shop
61
+ * Maximum 25 metafields per request, atomic operation
62
+ */
63
+ export const METAFIELDS_SET = `
64
+ mutation metafieldsSet($metafields: [MetafieldsSetInput!]!) {
65
+ metafieldsSet(metafields: $metafields) {
66
+ metafields {
67
+ id
68
+ namespace
69
+ key
70
+ value
71
+ type
72
+ createdAt
73
+ updatedAt
74
+ }
75
+ userErrors {
76
+ field
77
+ message
78
+ code
79
+ }
80
+ }
81
+ }
82
+ `;
83
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/commands/shop/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;CAM1B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;CAejC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;CAmBlC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;CAmB7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shop Service - Business Logic Layer
3
+ *
4
+ * Following Service Layer Pattern - all shop business logic here
5
+ * Thin command handlers delegate to these methods
6
+ */
7
+ import type { ShopifyCredentials } from '../../lib/types.js';
8
+ import { CommandResult, SetShopMetafieldInput, GetShopMetafieldInput } from './types.js';
9
+ export declare class ShopService {
10
+ /**
11
+ * Get shop ID
12
+ * Required for metafield mutations (ownerId)
13
+ */
14
+ static getShopId(credentials: ShopifyCredentials): Promise<CommandResult<{
15
+ shopId: string;
16
+ }>>;
17
+ /**
18
+ * Set shop metafield value
19
+ */
20
+ static setMetafield(credentials: ShopifyCredentials, input: SetShopMetafieldInput): Promise<CommandResult>;
21
+ /**
22
+ * Get shop metafield(s)
23
+ * Supports:
24
+ * - Specific metafield (namespace + key)
25
+ * - All metafields in namespace (namespace only)
26
+ * - All metafields (no params)
27
+ */
28
+ static getMetafield(credentials: ShopifyCredentials, input: GetShopMetafieldInput): Promise<CommandResult>;
29
+ }
30
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/commands/shop/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAO7D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EAKtB,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB;;;OAGG;WACU,SAAS,CAAC,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAsBnG;;OAEG;WACU,YAAY,CACvB,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAiEzB;;;;;;OAMG;WACU,YAAY,CACvB,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,aAAa,CAAC;CAmD1B"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Shop Service - Business Logic Layer
3
+ *
4
+ * Following Service Layer Pattern - all shop business logic here
5
+ * Thin command handlers delegate to these methods
6
+ */
7
+ import { shopifyGraphQL } from '../../lib/shopify-client.js';
8
+ import { GET_SHOP_ID, GET_SHOP_METAFIELD, GET_SHOP_METAFIELDS, METAFIELDS_SET } from './queries.js';
9
+ export class ShopService {
10
+ /**
11
+ * Get shop ID
12
+ * Required for metafield mutations (ownerId)
13
+ */
14
+ static async getShopId(credentials) {
15
+ const response = await shopifyGraphQL(credentials, GET_SHOP_ID, {});
16
+ if (!response.data?.shop) {
17
+ return {
18
+ success: false,
19
+ error: 'Shop not found'
20
+ };
21
+ }
22
+ return {
23
+ success: true,
24
+ data: {
25
+ shopId: response.data.shop.id
26
+ }
27
+ };
28
+ }
29
+ /**
30
+ * Set shop metafield value
31
+ */
32
+ static async setMetafield(credentials, input) {
33
+ // Get shop ID first
34
+ const shopIdResult = await this.getShopId(credentials);
35
+ if (!shopIdResult.success || !shopIdResult.data) {
36
+ return {
37
+ success: false,
38
+ error: shopIdResult.error || 'Failed to get shop ID'
39
+ };
40
+ }
41
+ const { shopId } = shopIdResult.data;
42
+ // Prepare metafield input
43
+ const metafieldInput = {
44
+ ownerId: shopId,
45
+ namespace: input.namespace,
46
+ key: input.key,
47
+ value: input.value,
48
+ type: input.type
49
+ };
50
+ // Execute mutation
51
+ const response = await shopifyGraphQL(credentials, METAFIELDS_SET, { metafields: [metafieldInput] });
52
+ // Check for user errors
53
+ const userErrors = response.data?.metafieldsSet?.userErrors || [];
54
+ if (userErrors.length > 0) {
55
+ const errors = userErrors
56
+ .map((e) => e.message)
57
+ .join(', ');
58
+ return {
59
+ success: false,
60
+ error: `GraphQL errors: ${errors}`
61
+ };
62
+ }
63
+ // Return the set metafield
64
+ const metafield = response.data?.metafieldsSet?.metafields?.[0];
65
+ if (!metafield) {
66
+ return {
67
+ success: false,
68
+ error: 'No metafield returned from mutation'
69
+ };
70
+ }
71
+ return {
72
+ success: true,
73
+ data: {
74
+ metafield: {
75
+ id: metafield.id,
76
+ namespace: metafield.namespace,
77
+ key: metafield.key,
78
+ value: metafield.value,
79
+ type: metafield.type,
80
+ createdAt: metafield.createdAt,
81
+ updatedAt: metafield.updatedAt
82
+ }
83
+ }
84
+ };
85
+ }
86
+ /**
87
+ * Get shop metafield(s)
88
+ * Supports:
89
+ * - Specific metafield (namespace + key)
90
+ * - All metafields in namespace (namespace only)
91
+ * - All metafields (no params)
92
+ */
93
+ static async getMetafield(credentials, input) {
94
+ // If both namespace and key provided, get specific metafield
95
+ if (input.namespace && input.key) {
96
+ const response = await shopifyGraphQL(credentials, GET_SHOP_METAFIELD, { namespace: input.namespace, key: input.key });
97
+ if (!response.data?.shop) {
98
+ return {
99
+ success: false,
100
+ error: 'Shop not found'
101
+ };
102
+ }
103
+ return {
104
+ success: true,
105
+ data: {
106
+ metafield: response.data.shop.metafield
107
+ }
108
+ };
109
+ }
110
+ // Otherwise, get multiple metafields
111
+ const response = await shopifyGraphQL(credentials, GET_SHOP_METAFIELDS, {
112
+ namespace: input.namespace || undefined,
113
+ first: 250 // Maximum allowed
114
+ });
115
+ if (!response.data?.shop) {
116
+ return {
117
+ success: false,
118
+ error: 'Shop not found'
119
+ };
120
+ }
121
+ const metafields = response.data.shop.metafields.edges.map((edge) => edge.node);
122
+ return {
123
+ success: true,
124
+ data: {
125
+ metafields,
126
+ count: metafields.length
127
+ }
128
+ };
129
+ }
130
+ }
131
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/shop/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Set Shop Metafield Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ShopService
6
+ */
7
+ export declare function run(argv?: string[]): Promise<void>;
8
+ //# sourceMappingURL=set-metafield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-metafield.d.ts","sourceRoot":"","sources":["../../../src/commands/shop/set-metafield.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmIH,wBAAsB,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,iBA6C/D"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Set Shop Metafield Command
3
+ *
4
+ * Following Command Pattern - thin orchestration layer
5
+ * Delegates business logic to ShopService
6
+ */
7
+ import { getCredentials, getSessionId } from '../../lib/api-client.js';
8
+ import { parseArgs, hasHelpFlag } from '../../lib/args-parser.js';
9
+ import { ShopService } from './service.js';
10
+ function showHelp() {
11
+ console.log(`
12
+ Set Shop Metafield
13
+
14
+ USAGE:
15
+ ecomcoder shop set-metafield [OPTIONS]
16
+
17
+ REQUIRED OPTIONS:
18
+ --namespace <namespace> Metafield namespace (e.g., 'custom', 'app')
19
+ --key <key> Metafield key/identifier
20
+ --value <value> Metafield value (format depends on type)
21
+ --type <type> Metafield type (see list below)
22
+
23
+ OPTIONAL:
24
+ --session-id Session ID (auto-provided via SESSION_ID env var)
25
+ --help, -h Show this help message
26
+
27
+ SUPPORTED TYPES:
28
+ Text:
29
+ single_line_text_field Single line of text
30
+ multi_line_text_field Multiple lines of text
31
+ rich_text_field Rich text with formatting
32
+
33
+ Numbers:
34
+ number_integer Whole numbers
35
+ number_decimal Decimal numbers
36
+ rating Rating on a scale
37
+
38
+ Boolean:
39
+ boolean True or false value
40
+
41
+ Dates:
42
+ date ISO 8601 date (YYYY-MM-DD)
43
+ date_time ISO 8601 timestamp
44
+
45
+ Measurements:
46
+ dimension Length with unit
47
+ volume Volume with unit
48
+ weight Weight with unit
49
+
50
+ Commerce:
51
+ money Amount with currency
52
+ color Hexadecimal color code
53
+
54
+ References (Links to Shopify Resources):
55
+ product_reference Link to a product
56
+ variant_reference Link to a variant
57
+ collection_reference Link to a collection
58
+ page_reference Link to a page
59
+ file_reference Link to uploaded file
60
+
61
+ Other:
62
+ url URL (https, http, mailto, sms, tel)
63
+ json JSON-serializable value
64
+ link Text and URL pairing
65
+
66
+ Lists (prefix with 'list.'):
67
+ list.single_line_text_field
68
+ list.number_integer
69
+ list.product_reference
70
+ list.color
71
+ (etc. - all types support lists)
72
+
73
+ EXAMPLES:
74
+ # Store-wide announcement
75
+ ecomcoder shop set-metafield \\
76
+ --namespace=custom \\
77
+ --key=announcement \\
78
+ --value="Black Friday Sale!" \\
79
+ --type=single_line_text_field
80
+
81
+ # Free shipping minimum
82
+ ecomcoder shop set-metafield \\
83
+ --namespace=custom \\
84
+ --key=free_shipping_min \\
85
+ --value="50.00" \\
86
+ --type=number_decimal
87
+
88
+ # Featured products (global)
89
+ ecomcoder shop set-metafield \\
90
+ --namespace=custom \\
91
+ --key=featured_products \\
92
+ --value='["gid://shopify/Product/123","gid://shopify/Product/456"]' \\
93
+ --type=list.product_reference
94
+
95
+ # Store settings as JSON
96
+ ecomcoder shop set-metafield \\
97
+ --namespace=custom \\
98
+ --key=settings \\
99
+ --value='{"theme":"dark","currency":"USD"}' \\
100
+ --type=json
101
+
102
+ # Enable feature flag
103
+ ecomcoder shop set-metafield \\
104
+ --namespace=features \\
105
+ --key=show_reviews \\
106
+ --value="true" \\
107
+ --type=boolean
108
+
109
+ OUTPUT FORMAT:
110
+ {
111
+ "success": true,
112
+ "data": {
113
+ "metafield": {
114
+ "id": "gid://shopify/Metafield/123",
115
+ "namespace": "custom",
116
+ "key": "announcement",
117
+ "value": "Black Friday Sale!",
118
+ "type": "single_line_text_field",
119
+ "createdAt": "2024-01-20T10:30:00Z",
120
+ "updatedAt": "2024-01-20T15:45:00Z"
121
+ }
122
+ }
123
+ }
124
+
125
+ NOTES:
126
+ - Maximum 25 metafields per request
127
+ - Maximum 10MB total payload size
128
+ - All values stored as strings (validated by type)
129
+ - Reference types use GID format: gid://shopify/Resource/ID
130
+ - List values must be valid JSON arrays
131
+ `);
132
+ process.exit(0);
133
+ }
134
+ export async function run(argv = process.argv.slice(2)) {
135
+ if (hasHelpFlag(argv)) {
136
+ showHelp();
137
+ }
138
+ const args = parseArgs(argv);
139
+ // Validate required arguments
140
+ const requiredArgs = ['namespace', 'key', 'value', 'type'];
141
+ const missing = requiredArgs.filter(arg => !args[arg]);
142
+ if (missing.length > 0) {
143
+ console.error(JSON.stringify({
144
+ success: false,
145
+ error: `Missing required arguments: ${missing.map(a => `--${a}`).join(', ')}`
146
+ }));
147
+ process.exit(1);
148
+ }
149
+ try {
150
+ // Get credentials
151
+ const sessionId = getSessionId(args.sessionId);
152
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
153
+ // Execute set metafield via service
154
+ const result = await ShopService.setMetafield(credentials, {
155
+ namespace: args.namespace,
156
+ key: args.key,
157
+ value: args.value,
158
+ type: args.type
159
+ });
160
+ // Output result
161
+ console.log(JSON.stringify(result, null, 2));
162
+ if (!result.success) {
163
+ process.exit(1);
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.error(JSON.stringify({
168
+ success: false,
169
+ error: error.message || 'Unknown error occurred'
170
+ }));
171
+ process.exit(1);
172
+ }
173
+ }
174
+ //# sourceMappingURL=set-metafield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-metafield.js","sourceRoot":"","sources":["../../../src/commands/shop/set-metafield.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,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwHb,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,8BAA8B;IAC9B,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+BAA+B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC9E,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,oCAAoC;QACpC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE;YACzD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7C,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,84 @@
1
+ /**
2
+ * Shop Command Types
3
+ * Type definitions for shop-related commands
4
+ */
5
+ /**
6
+ * Shop metafield operations
7
+ */
8
+ export interface SetShopMetafieldInput {
9
+ namespace: string;
10
+ key: string;
11
+ value: string;
12
+ type: string;
13
+ }
14
+ export interface GetShopMetafieldInput {
15
+ namespace?: string;
16
+ key?: string;
17
+ }
18
+ /**
19
+ * Shopify GraphQL response types
20
+ */
21
+ export interface ShopMetafieldResponse {
22
+ shop: {
23
+ id: string;
24
+ metafield: {
25
+ id: string;
26
+ namespace: string;
27
+ key: string;
28
+ value: string;
29
+ type: string;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ } | null;
33
+ } | null;
34
+ }
35
+ export interface ShopMetafieldsResponse {
36
+ shop: {
37
+ id: string;
38
+ metafields: {
39
+ edges: Array<{
40
+ node: {
41
+ id: string;
42
+ namespace: string;
43
+ key: string;
44
+ value: string;
45
+ type: string;
46
+ createdAt: string;
47
+ updatedAt: string;
48
+ };
49
+ }>;
50
+ };
51
+ } | null;
52
+ }
53
+ export interface MetafieldsSetResponse {
54
+ metafieldsSet: {
55
+ metafields: Array<{
56
+ id: string;
57
+ namespace: string;
58
+ key: string;
59
+ value: string;
60
+ type: string;
61
+ createdAt: string;
62
+ updatedAt: string;
63
+ }>;
64
+ userErrors: Array<{
65
+ field: string[] | null;
66
+ message: string;
67
+ code?: string;
68
+ }>;
69
+ };
70
+ }
71
+ export interface ShopIdResponse {
72
+ shop: {
73
+ id: string;
74
+ };
75
+ }
76
+ /**
77
+ * CLI command result types
78
+ */
79
+ export interface CommandResult<T = any> {
80
+ success: boolean;
81
+ data?: T;
82
+ error?: string;
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/shop/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE;YACT,EAAE,EAAE,MAAM,CAAC;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,GAAG,IAAI,CAAC;KACV,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE;YACV,KAAK,EAAE,KAAK,CAAC;gBACX,IAAI,EAAE;oBACJ,EAAE,EAAE,MAAM,CAAC;oBACX,SAAS,EAAE,MAAM,CAAC;oBAClB,GAAG,EAAE,MAAM,CAAC;oBACZ,KAAK,EAAE,MAAM,CAAC;oBACd,IAAI,EAAE,MAAM,CAAC;oBACb,SAAS,EAAE,MAAM,CAAC;oBAClB,SAAS,EAAE,MAAM,CAAC;iBACnB,CAAC;aACH,CAAC,CAAC;SACJ,CAAC;KACH,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE;QACb,UAAU,EAAE,KAAK,CAAC;YAChB,EAAE,EAAE,MAAM,CAAC;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;QACH,UAAU,EAAE,KAAK,CAAC;YAChB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shop Command Types
3
+ * Type definitions for shop-related commands
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/shop/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecomcoder-cli",
3
- "version": "1.3.3",
3
+ "version": "1.3.4",
4
4
  "type": "module",
5
5
  "description": "CLI tools for EcomCoder - Shopify development utilities",
6
6
  "main": "./dist/index.js",