@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 CHANGED
@@ -65,10 +65,10 @@ export { Shape, View, Model, Form };
65
65
  `);
66
66
  });
67
67
  program
68
- .command('copy <file> <name>')
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
- return parser(inputFile, { name, type: opts?.type }, { HUSAR_MCP_HOST: conf.host, HUSAR_MCP_ADMIN_TOKEN: conf.adminToken });
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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"}
@@ -4,4 +4,4 @@ export declare const parser: (inputFile: string, opts: {
4
4
  }, authentication: {
5
5
  HUSAR_MCP_HOST: string;
6
6
  HUSAR_MCP_ADMIN_TOKEN: string;
7
- }) => Promise<any>;
7
+ }) => Promise<boolean>;
@@ -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
- const put = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
10
- method: 'POST',
11
- headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
12
- body: JSON.stringify({
13
- query: `mutation GetUploadURL($input: UploadFileInput!) { admin { uploadFile(file: $input) { putURL cdnURL } } }`,
14
- variables: { input: { prefix, key } },
15
- }),
16
- });
17
- const response = await put.json();
18
- const putURL = response?.data?.admin?.uploadFile?.putURL;
19
- const cdnURL = response?.data?.admin?.uploadFile?.cdnURL;
20
- await fetch(putURL, { method: 'PUT', headers: { 'Content-Type': 'text/plain', 'x-amz-acl': 'public-read' }, body });
21
- const result = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
22
- method: 'POST',
23
- headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
24
- body: JSON.stringify({
25
- query: `mutation ParseFile($input: ParseFileInput!) { admin { parseFile(input: $input) { name type status } } }`,
26
- variables: {
27
- input: { key: [prefix, key].join('/'), fileURL: cdnURL, name: opts.name, type: opts.type.toUpperCase() },
28
- },
29
- }),
30
- });
31
- return (await result.json())?.data?.admin?.parseFile;
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;QACzE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACnF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,0GAA0G;YACjH,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;SACtC,CAAC;KACH,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;IACzD,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;IACzD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACnF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,yGAAyG;YAChH,SAAS,EAAE;gBACT,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;aACzG;SACF,CAAC;KACH,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;AACvD,CAAC,CAAC"}
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.7",
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.7",
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 <file> <name>')
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
- return parser(
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);
@@ -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
- const put = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
16
- method: 'POST',
17
- headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
18
- body: JSON.stringify({
19
- query: `mutation GetUploadURL($input: UploadFileInput!) { admin { uploadFile(file: $input) { putURL cdnURL } } }`,
20
- variables: { input: { prefix, key } },
21
- }),
22
- });
23
- const response = await put.json();
24
- const putURL = response?.data?.admin?.uploadFile?.putURL;
25
- const cdnURL = response?.data?.admin?.uploadFile?.cdnURL;
26
- await fetch(putURL, { method: 'PUT', headers: { 'Content-Type': 'text/plain', 'x-amz-acl': 'public-read' }, body });
27
- const result = await fetch(new URL('api/graphql', HUSAR_MCP_HOST).toString(), {
28
- method: 'POST',
29
- headers: { 'Content-Type': 'application/json', husar_token: HUSAR_MCP_ADMIN_TOKEN },
30
- body: JSON.stringify({
31
- query: `mutation ParseFile($input: ParseFileInput!) { admin { parseFile(input: $input) { name type status } } }`,
32
- variables: {
33
- input: { key: [prefix, key].join('/'), fileURL: cdnURL, name: opts.name, type: opts.type.toUpperCase() },
34
- },
35
- }),
36
- });
37
- return (await result.json())?.data?.admin?.parseFile;
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
  };