@husar.ai/cli 0.2.7 → 0.2.9
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 +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/functions/parser.d.ts +1 -1
- package/dist/functions/parser.js +49 -23
- package/dist/functions/parser.js.map +1 -1
- package/package.json +2 -2
- package/src/cli.ts +4 -3
- package/src/functions/parser.ts +45 -23
package/dist/cli.js
CHANGED
|
@@ -65,10 +65,10 @@ export { Shape, View, Model, Form };
|
|
|
65
65
|
`);
|
|
66
66
|
});
|
|
67
67
|
program
|
|
68
|
-
.command('copy <
|
|
68
|
+
.command('copy <inputFile> <name>')
|
|
69
69
|
.description('AI-parse HTML/JSX and upsert into CMS (model/shape) using gpt-5')
|
|
70
70
|
.option('-t, --type <type>', 'target type: model|shape', 'shape')
|
|
71
|
-
.action((inputFile, name, opts) => {
|
|
71
|
+
.action(async (inputFile, name, opts) => {
|
|
72
72
|
const conf = config.get();
|
|
73
73
|
if (!conf.host) {
|
|
74
74
|
throw new Error('Host is not configured. Please run "husar generate" first.');
|
|
@@ -76,7 +76,8 @@ program
|
|
|
76
76
|
if (!conf.adminToken) {
|
|
77
77
|
throw new Error('Admin token is not configured. Please set it in the config or use environment variable.');
|
|
78
78
|
}
|
|
79
|
-
|
|
79
|
+
const result = await parser(inputFile, { name, type: opts?.type }, { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: conf.adminToken });
|
|
80
|
+
console.log(result ? 'File parsed and upserted successfully.' : 'Failed to parse and upsert file.');
|
|
80
81
|
});
|
|
81
82
|
program.parse(process.argv);
|
|
82
83
|
//# sourceMappingURL=cli.js.map
|
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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"}
|
package/dist/functions/parser.js
CHANGED
|
@@ -6,28 +6,54 @@ export const parser = async (inputFile, opts, authentication) => {
|
|
|
6
6
|
const body = await fs.readFile(path.resolve(process.cwd(), inputFile), 'utf8');
|
|
7
7
|
const prefix = ['DOWNLOADABLE-FILES', 'parse'].join('/');
|
|
8
8
|
const key = `${opts.name}-${filename}-${new Date().getTime()}.txt`;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
9
|
+
let putURL, fileURL;
|
|
10
|
+
try {
|
|
11
|
+
const put = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
query: `mutation GetUploadURL($input: UploadFileInput!) { admin { uploadFile(file: $input) { putURL cdnURL } } }`,
|
|
16
|
+
variables: { input: { prefix, key } },
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
const result = await put.json();
|
|
20
|
+
putURL = result?.data?.admin?.uploadFile?.putURL;
|
|
21
|
+
fileURL = result?.data?.admin?.uploadFile?.cdnURL;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
console.log('Failed to get upload URL');
|
|
25
|
+
throw new Error('Failed to get upload URL');
|
|
26
|
+
}
|
|
27
|
+
if (!putURL) {
|
|
28
|
+
console.log('Failed to get upload URL');
|
|
29
|
+
throw new Error('Failed to get upload URL');
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await fetch(putURL, { method: 'PUT', headers: { 'Content-Type': 'text/plain' }, body });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
console.log('Failed to upload file');
|
|
36
|
+
}
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
38
|
+
try {
|
|
39
|
+
const result = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
query: `mutation ParseFile($input: ParseFileInput!) { admin { parseFile(input: $input) { name type status } } }`,
|
|
44
|
+
variables: { input: { key: [prefix, key].join('/'), fileURL, name: opts.name, type: opts.type.toUpperCase() } },
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
const json = await result.json();
|
|
48
|
+
if (!json?.data?.admin?.parseFile) {
|
|
49
|
+
if (process.env.DEBUG)
|
|
50
|
+
console.dir(json, { depth: null });
|
|
51
|
+
throw new Error('Failed to parse file');
|
|
52
|
+
}
|
|
53
|
+
return !!json?.data?.admin?.parseFile;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error('Failed to parse file');
|
|
57
|
+
}
|
|
32
58
|
};
|
|
33
59
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/functions/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,SAAiB,EACjB,IAA+C,EAC/C,cAAyE,EACzE,EAAE;IACF,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/functions/parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@husar.ai/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"watch": "tspc --watch"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@husar.ai/ssr": "^0.2.
|
|
18
|
+
"@husar.ai/ssr": "^0.2.9",
|
|
19
19
|
"commander": "^11.0.0",
|
|
20
20
|
"config-maker": "^0.0.6"
|
|
21
21
|
},
|
package/src/cli.ts
CHANGED
|
@@ -83,10 +83,10 @@ export { Shape, View, Model, Form };
|
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
program
|
|
86
|
-
.command('copy <
|
|
86
|
+
.command('copy <inputFile> <name>')
|
|
87
87
|
.description('AI-parse HTML/JSX and upsert into CMS (model/shape) using gpt-5')
|
|
88
88
|
.option('-t, --type <type>', 'target type: model|shape', 'shape')
|
|
89
|
-
.action((inputFile, name, opts) => {
|
|
89
|
+
.action(async (inputFile, name, opts) => {
|
|
90
90
|
const conf = config.get();
|
|
91
91
|
if (!conf.host) {
|
|
92
92
|
throw new Error('Host is not configured. Please run "husar generate" first.');
|
|
@@ -94,11 +94,12 @@ program
|
|
|
94
94
|
if (!conf.adminToken) {
|
|
95
95
|
throw new Error('Admin token is not configured. Please set it in the config or use environment variable.');
|
|
96
96
|
}
|
|
97
|
-
|
|
97
|
+
const result = await parser(
|
|
98
98
|
inputFile,
|
|
99
99
|
{ name, type: opts?.type },
|
|
100
100
|
{ HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: conf.adminToken },
|
|
101
101
|
);
|
|
102
|
+
console.log(result ? 'File parsed and upserted successfully.' : 'Failed to parse and upsert file.');
|
|
102
103
|
});
|
|
103
104
|
|
|
104
105
|
program.parse(process.argv);
|
package/src/functions/parser.ts
CHANGED
|
@@ -12,27 +12,49 @@ export const parser = async (
|
|
|
12
12
|
const body = await fs.readFile(path.resolve(process.cwd(), inputFile), 'utf8');
|
|
13
13
|
const prefix = ['DOWNLOADABLE-FILES', 'parse'].join('/');
|
|
14
14
|
const key = `${opts.name}-${filename}-${new Date().getTime()}.txt`;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
let putURL, fileURL;
|
|
16
|
+
try {
|
|
17
|
+
const put = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
|
|
20
|
+
body: JSON.stringify({
|
|
21
|
+
query: `mutation GetUploadURL($input: UploadFileInput!) { admin { uploadFile(file: $input) { putURL cdnURL } } }`,
|
|
22
|
+
variables: { input: { prefix, key } },
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
const result = await put.json();
|
|
26
|
+
putURL = result?.data?.admin?.uploadFile?.putURL;
|
|
27
|
+
fileURL = result?.data?.admin?.uploadFile?.cdnURL;
|
|
28
|
+
} catch {
|
|
29
|
+
console.log('Failed to get upload URL');
|
|
30
|
+
throw new Error('Failed to get upload URL');
|
|
31
|
+
}
|
|
32
|
+
if (!putURL) {
|
|
33
|
+
console.log('Failed to get upload URL');
|
|
34
|
+
throw new Error('Failed to get upload URL');
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
await fetch(putURL, { method: 'PUT', headers: { 'Content-Type': 'text/plain' }, body });
|
|
38
|
+
} catch {
|
|
39
|
+
console.log('Failed to upload file');
|
|
40
|
+
}
|
|
41
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
42
|
+
try {
|
|
43
|
+
const result = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
|
|
46
|
+
body: JSON.stringify({
|
|
47
|
+
query: `mutation ParseFile($input: ParseFileInput!) { admin { parseFile(input: $input) { name type status } } }`,
|
|
48
|
+
variables: { input: { key: [prefix, key].join('/'), fileURL, name: opts.name, type: opts.type.toUpperCase() } },
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
const json = await result.json();
|
|
52
|
+
if (!json?.data?.admin?.parseFile) {
|
|
53
|
+
if (process.env.DEBUG) console.dir(json, { depth: null });
|
|
54
|
+
throw new Error('Failed to parse file');
|
|
55
|
+
}
|
|
56
|
+
return !!json?.data?.admin?.parseFile;
|
|
57
|
+
} catch {
|
|
58
|
+
throw new Error('Failed to parse file');
|
|
59
|
+
}
|
|
38
60
|
};
|