ecomcoder-cli 1.3.9 → 1.3.11

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 (55) hide show
  1. package/dist/cli.js +2 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/asset/delete.d.ts +5 -0
  4. package/dist/commands/asset/delete.d.ts.map +1 -0
  5. package/dist/commands/asset/delete.js +54 -0
  6. package/dist/commands/asset/delete.js.map +1 -0
  7. package/dist/commands/asset/external-apis.d.ts +13 -0
  8. package/dist/commands/asset/external-apis.d.ts.map +1 -0
  9. package/dist/commands/asset/external-apis.js +99 -0
  10. package/dist/commands/asset/external-apis.js.map +1 -0
  11. package/dist/commands/asset/get.d.ts +5 -0
  12. package/dist/commands/asset/get.d.ts.map +1 -0
  13. package/dist/commands/asset/get.js +54 -0
  14. package/dist/commands/asset/get.js.map +1 -0
  15. package/dist/commands/asset/import.d.ts +5 -0
  16. package/dist/commands/asset/import.d.ts.map +1 -0
  17. package/dist/commands/asset/import.js +57 -0
  18. package/dist/commands/asset/import.js.map +1 -0
  19. package/dist/commands/asset/index.d.ts +5 -0
  20. package/dist/commands/asset/index.d.ts.map +1 -0
  21. package/dist/commands/asset/index.js +75 -0
  22. package/dist/commands/asset/index.js.map +1 -0
  23. package/dist/commands/asset/list.d.ts +5 -0
  24. package/dist/commands/asset/list.d.ts.map +1 -0
  25. package/dist/commands/asset/list.js +53 -0
  26. package/dist/commands/asset/list.js.map +1 -0
  27. package/dist/commands/asset/queries.d.ts +12 -0
  28. package/dist/commands/asset/queries.d.ts.map +1 -0
  29. package/dist/commands/asset/queries.js +135 -0
  30. package/dist/commands/asset/queries.js.map +1 -0
  31. package/dist/commands/asset/search-icons.d.ts +6 -0
  32. package/dist/commands/asset/search-icons.d.ts.map +1 -0
  33. package/dist/commands/asset/search-icons.js +84 -0
  34. package/dist/commands/asset/search-icons.js.map +1 -0
  35. package/dist/commands/asset/search-stock.d.ts +6 -0
  36. package/dist/commands/asset/search-stock.d.ts.map +1 -0
  37. package/dist/commands/asset/search-stock.js +79 -0
  38. package/dist/commands/asset/search-stock.js.map +1 -0
  39. package/dist/commands/asset/service.d.ts +62 -0
  40. package/dist/commands/asset/service.d.ts.map +1 -0
  41. package/dist/commands/asset/service.js +417 -0
  42. package/dist/commands/asset/service.js.map +1 -0
  43. package/dist/commands/asset/types.d.ts +166 -0
  44. package/dist/commands/asset/types.d.ts.map +1 -0
  45. package/dist/commands/asset/types.js +5 -0
  46. package/dist/commands/asset/types.js.map +1 -0
  47. package/dist/commands/asset/upload.d.ts +5 -0
  48. package/dist/commands/asset/upload.d.ts.map +1 -0
  49. package/dist/commands/asset/upload.js +75 -0
  50. package/dist/commands/asset/upload.js.map +1 -0
  51. package/dist/commands/asset/utils.d.ts +13 -0
  52. package/dist/commands/asset/utils.d.ts.map +1 -0
  53. package/dist/commands/asset/utils.js +68 -0
  54. package/dist/commands/asset/utils.js.map +1 -0
  55. package/package.json +4 -2
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Upload Asset Command
3
+ */
4
+ import { getCredentials, getSessionId } from '../../lib/api-client.js';
5
+ import { parseArgs, hasHelpFlag } from '../../lib/args-parser.js';
6
+ import { AssetService } from './service.js';
7
+ function showHelp() {
8
+ console.log(`
9
+ Upload Asset to Shopify
10
+
11
+ USAGE:
12
+ ecomcoder asset upload [OPTIONS]
13
+
14
+ OPTIONS:
15
+ --file <path> Local file path
16
+ --url <url> Remote URL (http:// or https://)
17
+ --alt <text> Alt text for accessibility (optional)
18
+ --help, -h Show this help message
19
+
20
+ NOTE:
21
+ Must provide either --file or --url (not both)
22
+
23
+ EXAMPLES:
24
+ # Upload local file
25
+ ecomcoder asset upload --file=./logo.png --alt="Company Logo"
26
+ ecomcoder asset upload --file=./video.mp4
27
+
28
+ # Upload from URL
29
+ ecomcoder asset upload --url=https://example.com/image.jpg
30
+ ecomcoder asset upload --url=https://example.com/video.mp4 --alt="Demo Video"
31
+ `);
32
+ process.exit(0);
33
+ }
34
+ export async function run(argv = process.argv.slice(2)) {
35
+ if (hasHelpFlag(argv)) {
36
+ showHelp();
37
+ }
38
+ const args = parseArgs(argv);
39
+ // Validate: must provide either --file or --url (not both, not neither)
40
+ if (!args.file && !args.url) {
41
+ console.error(JSON.stringify({
42
+ success: false,
43
+ error: 'Must provide either --file or --url'
44
+ }));
45
+ process.exit(1);
46
+ }
47
+ if (args.file && args.url) {
48
+ console.error(JSON.stringify({
49
+ success: false,
50
+ error: 'Cannot use both --file and --url'
51
+ }));
52
+ process.exit(1);
53
+ }
54
+ try {
55
+ const sessionId = getSessionId(args.sessionId);
56
+ const credentials = await getCredentials(sessionId, args.backendUrl, args.jwt);
57
+ const result = await AssetService.upload(credentials, {
58
+ file: args.file,
59
+ url: args.url,
60
+ alt: args.alt
61
+ });
62
+ console.log(JSON.stringify(result, null, 2));
63
+ if (!result.success) {
64
+ process.exit(1);
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error(JSON.stringify({
69
+ success: false,
70
+ error: error.message || 'Unknown error occurred'
71
+ }));
72
+ process.exit(1);
73
+ }
74
+ }
75
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/commands/asset/upload.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,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,wEAAwE;IACxE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,qCAAqC;SAC7C,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kCAAkC;SAC1C,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,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,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QAEH,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,13 @@
1
+ /**
2
+ * Asset Utilities
3
+ * Helper functions for asset operations
4
+ */
5
+ /**
6
+ * Download URL to temporary file
7
+ * Returns: { path: string, cleanup: () => void }
8
+ */
9
+ export declare function downloadUrlToTemp(url: string): Promise<{
10
+ path: string;
11
+ cleanup: () => void;
12
+ }>;
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/commands/asset/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC,CAoDD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Asset Utilities
3
+ * Helper functions for asset operations
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ /**
9
+ * Download URL to temporary file
10
+ * Returns: { path: string, cleanup: () => void }
11
+ */
12
+ export async function downloadUrlToTemp(url) {
13
+ // Validate URL
14
+ if (!url.startsWith('http://') && !url.startsWith('https://')) {
15
+ throw new Error('Invalid URL: must be http:// or https://');
16
+ }
17
+ // Fetch the file
18
+ const response = await fetch(url);
19
+ if (!response.ok) {
20
+ throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
21
+ }
22
+ // Get content type for validation and extension
23
+ const contentType = response.headers.get('content-type') || '';
24
+ // Validate content type
25
+ if (!contentType.startsWith('image/') && !contentType.startsWith('video/')) {
26
+ throw new Error(`Invalid content type: ${contentType}. Must be image/* or video/*`);
27
+ }
28
+ // Determine file extension
29
+ const urlPath = new URL(url).pathname;
30
+ const urlExt = path.extname(urlPath);
31
+ const ext = urlExt || getExtensionFromMimeType(contentType);
32
+ // Create temp file path
33
+ const tempFile = path.join(os.tmpdir(), `ecomcoder-upload-${Date.now()}${ext}`);
34
+ // Write to temp file
35
+ const buffer = Buffer.from(await response.arrayBuffer());
36
+ fs.writeFileSync(tempFile, buffer);
37
+ return {
38
+ path: tempFile,
39
+ cleanup: () => {
40
+ try {
41
+ if (fs.existsSync(tempFile)) {
42
+ fs.unlinkSync(tempFile);
43
+ }
44
+ }
45
+ catch (err) {
46
+ // Ignore cleanup errors
47
+ }
48
+ }
49
+ };
50
+ }
51
+ /**
52
+ * Get file extension from MIME type
53
+ */
54
+ function getExtensionFromMimeType(mimeType) {
55
+ const map = {
56
+ 'image/jpeg': '.jpg',
57
+ 'image/png': '.png',
58
+ 'image/gif': '.gif',
59
+ 'image/webp': '.webp',
60
+ 'image/svg+xml': '.svg',
61
+ 'video/mp4': '.mp4',
62
+ 'video/quicktime': '.mov',
63
+ 'video/x-msvideo': '.avi',
64
+ 'video/webm': '.webm',
65
+ };
66
+ return map[mimeType] || '.bin';
67
+ }
68
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/asset/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAIjD,eAAe;IACf,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAChE,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAE/D,wBAAwB;IACxB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,yBAAyB,WAAW,8BAA8B,CACnE,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,IAAI,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAE5D,wBAAwB;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,EAAE,CAAC,MAAM,EAAE,EACX,oBAAoB,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CACvC,CAAC;IAEF,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,wBAAwB;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAgB;IAChD,MAAM,GAAG,GAA2B;QAClC,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,OAAO;QACrB,eAAe,EAAE,MAAM;QACvB,WAAW,EAAE,MAAM;QACnB,iBAAiB,EAAE,MAAM;QACzB,iBAAiB,EAAE,MAAM;QACzB,YAAY,EAAE,OAAO;KACtB,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecomcoder-cli",
3
- "version": "1.3.9",
3
+ "version": "1.3.11",
4
4
  "type": "module",
5
5
  "description": "CLI tools for EcomCoder - Shopify development utilities",
6
6
  "main": "./dist/index.js",
@@ -17,6 +17,7 @@
17
17
  "test:integration": "tsx scripts/integration-tests/index.ts",
18
18
  "test:integration:product": "tsx scripts/integration-tests/product/index.ts",
19
19
  "test:integration:discount": "tsx scripts/integration-tests/discount/index.ts",
20
+ "test:integration:asset": "tsx scripts/integration-tests/asset/index.ts",
20
21
  "prepublishOnly": "npm run build",
21
22
  "release:patch": "npm version patch && npm publish",
22
23
  "release:minor": "npm version minor && npm publish",
@@ -49,7 +50,8 @@
49
50
  },
50
51
  "dependencies": {
51
52
  "@pinecone-database/pinecone": "^6.1.3",
52
- "@supabase/supabase-js": "^2.87.0"
53
+ "@supabase/supabase-js": "^2.87.0",
54
+ "form-data": "^4.0.0"
53
55
  },
54
56
  "devDependencies": {
55
57
  "@types/node": "^20.10.0",