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.
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/asset/delete.d.ts +5 -0
- package/dist/commands/asset/delete.d.ts.map +1 -0
- package/dist/commands/asset/delete.js +54 -0
- package/dist/commands/asset/delete.js.map +1 -0
- package/dist/commands/asset/external-apis.d.ts +13 -0
- package/dist/commands/asset/external-apis.d.ts.map +1 -0
- package/dist/commands/asset/external-apis.js +99 -0
- package/dist/commands/asset/external-apis.js.map +1 -0
- package/dist/commands/asset/get.d.ts +5 -0
- package/dist/commands/asset/get.d.ts.map +1 -0
- package/dist/commands/asset/get.js +54 -0
- package/dist/commands/asset/get.js.map +1 -0
- package/dist/commands/asset/import.d.ts +5 -0
- package/dist/commands/asset/import.d.ts.map +1 -0
- package/dist/commands/asset/import.js +57 -0
- package/dist/commands/asset/import.js.map +1 -0
- package/dist/commands/asset/index.d.ts +5 -0
- package/dist/commands/asset/index.d.ts.map +1 -0
- package/dist/commands/asset/index.js +75 -0
- package/dist/commands/asset/index.js.map +1 -0
- package/dist/commands/asset/list.d.ts +5 -0
- package/dist/commands/asset/list.d.ts.map +1 -0
- package/dist/commands/asset/list.js +53 -0
- package/dist/commands/asset/list.js.map +1 -0
- package/dist/commands/asset/queries.d.ts +12 -0
- package/dist/commands/asset/queries.d.ts.map +1 -0
- package/dist/commands/asset/queries.js +135 -0
- package/dist/commands/asset/queries.js.map +1 -0
- package/dist/commands/asset/search-icons.d.ts +6 -0
- package/dist/commands/asset/search-icons.d.ts.map +1 -0
- package/dist/commands/asset/search-icons.js +84 -0
- package/dist/commands/asset/search-icons.js.map +1 -0
- package/dist/commands/asset/search-stock.d.ts +6 -0
- package/dist/commands/asset/search-stock.d.ts.map +1 -0
- package/dist/commands/asset/search-stock.js +79 -0
- package/dist/commands/asset/search-stock.js.map +1 -0
- package/dist/commands/asset/service.d.ts +62 -0
- package/dist/commands/asset/service.d.ts.map +1 -0
- package/dist/commands/asset/service.js +417 -0
- package/dist/commands/asset/service.js.map +1 -0
- package/dist/commands/asset/types.d.ts +166 -0
- package/dist/commands/asset/types.d.ts.map +1 -0
- package/dist/commands/asset/types.js +5 -0
- package/dist/commands/asset/types.js.map +1 -0
- package/dist/commands/asset/upload.d.ts +5 -0
- package/dist/commands/asset/upload.d.ts.map +1 -0
- package/dist/commands/asset/upload.js +75 -0
- package/dist/commands/asset/upload.js.map +1 -0
- package/dist/commands/asset/utils.d.ts +13 -0
- package/dist/commands/asset/utils.d.ts.map +1 -0
- package/dist/commands/asset/utils.js +68 -0
- package/dist/commands/asset/utils.js.map +1 -0
- 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.
|
|
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",
|