@_davideast/stitch-mcp 0.5.2 → 0.5.3

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 (126) hide show
  1. package/dist/chunk-22bymmh9.js +137 -0
  2. package/dist/chunk-22bymmh9.js.map +10 -0
  3. package/dist/chunk-387yyye2.js +248 -0
  4. package/dist/chunk-387yyye2.js.map +14 -0
  5. package/dist/chunk-3ff2k44g.js +19 -0
  6. package/dist/chunk-3ff2k44g.js.map +9 -0
  7. package/dist/chunk-46cay1zp.js +273 -0
  8. package/dist/chunk-46cay1zp.js.map +10 -0
  9. package/dist/chunk-48e1jpm8.js +167 -0
  10. package/dist/chunk-48e1jpm8.js.map +10 -0
  11. package/dist/chunk-4arzkk1s.js +69 -0
  12. package/dist/chunk-4arzkk1s.js.map +10 -0
  13. package/dist/chunk-4js7vw6h.js +415 -0
  14. package/dist/chunk-4js7vw6h.js.map +20 -0
  15. package/dist/chunk-4p1wfk3t.js +736 -0
  16. package/dist/chunk-4p1wfk3t.js.map +16 -0
  17. package/dist/chunk-4zg969tc.js +370 -0
  18. package/dist/chunk-4zg969tc.js.map +16 -0
  19. package/dist/chunk-5jjt7tgw.js +247 -0
  20. package/dist/chunk-5jjt7tgw.js.map +14 -0
  21. package/dist/chunk-5t2h8z2n.js +273 -0
  22. package/dist/chunk-5t2h8z2n.js.map +10 -0
  23. package/dist/chunk-5zy3et1m.js +759 -0
  24. package/dist/chunk-5zy3et1m.js.map +19 -0
  25. package/dist/chunk-6wvst7z8.js +125 -0
  26. package/dist/chunk-6wvst7z8.js.map +12 -0
  27. package/dist/chunk-8mm08arm.js +256 -0
  28. package/dist/chunk-8mm08arm.js.map +11 -0
  29. package/dist/chunk-8nv4wwv0.js +19 -0
  30. package/dist/chunk-8nv4wwv0.js.map +9 -0
  31. package/dist/chunk-9cjny9z2.js +19 -0
  32. package/dist/chunk-9cjny9z2.js.map +9 -0
  33. package/dist/chunk-9ggfw78s.js +19 -0
  34. package/dist/chunk-9ggfw78s.js.map +9 -0
  35. package/dist/chunk-9nyyn1hn.js +125 -0
  36. package/dist/chunk-9nyyn1hn.js.map +12 -0
  37. package/dist/chunk-9nzbvp6r.js +19 -0
  38. package/dist/chunk-9nzbvp6r.js.map +9 -0
  39. package/dist/chunk-a0gmbh8e.js +415 -0
  40. package/dist/chunk-a0gmbh8e.js.map +20 -0
  41. package/dist/chunk-acv998mp.js +941 -0
  42. package/dist/chunk-acv998mp.js.map +27 -0
  43. package/dist/chunk-cpjsvven.js +10 -0
  44. package/dist/chunk-cpjsvven.js.map +9 -0
  45. package/dist/chunk-dmrahbs1.js +31467 -0
  46. package/dist/chunk-dmrahbs1.js.map +245 -0
  47. package/dist/chunk-dts6851a.js +137 -0
  48. package/dist/chunk-dts6851a.js.map +10 -0
  49. package/dist/chunk-efd0rm6g.js +69 -0
  50. package/dist/chunk-efd0rm6g.js.map +10 -0
  51. package/dist/chunk-f1kjn6cd.js +16554 -0
  52. package/dist/chunk-f1kjn6cd.js.map +98 -0
  53. package/dist/chunk-f5f6ekgp.js +109 -0
  54. package/dist/chunk-f5f6ekgp.js.map +10 -0
  55. package/dist/chunk-fmewhfh3.js +137 -0
  56. package/dist/chunk-fmewhfh3.js.map +10 -0
  57. package/dist/chunk-fmhrn6cg.js +6382 -0
  58. package/dist/chunk-fmhrn6cg.js.map +109 -0
  59. package/dist/chunk-gh7dzfhb.js +256 -0
  60. package/dist/chunk-gh7dzfhb.js.map +11 -0
  61. package/dist/chunk-gwhtc0fe.js +370 -0
  62. package/dist/chunk-gwhtc0fe.js.map +16 -0
  63. package/dist/chunk-hc7sdwmn.js +449 -0
  64. package/dist/chunk-hc7sdwmn.js.map +17 -0
  65. package/dist/chunk-k4xwb3wp.js +44184 -0
  66. package/dist/chunk-k4xwb3wp.js.map +237 -0
  67. package/dist/chunk-k751yfm6.js +736 -0
  68. package/dist/chunk-k751yfm6.js.map +16 -0
  69. package/dist/chunk-kkc2tvar.js +19 -0
  70. package/dist/chunk-kkc2tvar.js.map +9 -0
  71. package/dist/chunk-kva47mgc.js +10 -0
  72. package/dist/chunk-kva47mgc.js.map +9 -0
  73. package/dist/chunk-nv2j020p.js +45210 -0
  74. package/dist/chunk-nv2j020p.js.map +258 -0
  75. package/dist/chunk-pdj9s41r.js +683 -0
  76. package/dist/chunk-pdj9s41r.js.map +17 -0
  77. package/dist/chunk-ppphsy4t.js +273 -0
  78. package/dist/chunk-ppphsy4t.js.map +10 -0
  79. package/dist/chunk-psmw9zpa.js +941 -0
  80. package/dist/chunk-psmw9zpa.js.map +27 -0
  81. package/dist/chunk-pz31v3ma.js +24 -0
  82. package/dist/chunk-pz31v3ma.js.map +9 -0
  83. package/dist/chunk-qbt0906e.js +1495 -0
  84. package/dist/chunk-qbt0906e.js.map +23 -0
  85. package/dist/chunk-rh3k09h7.js +19 -0
  86. package/dist/chunk-rh3k09h7.js.map +9 -0
  87. package/dist/chunk-saznae7w.js +10 -0
  88. package/dist/chunk-saznae7w.js.map +9 -0
  89. package/dist/chunk-sscqdg1j.js +69 -0
  90. package/dist/chunk-sscqdg1j.js.map +10 -0
  91. package/dist/chunk-stgj6y85.js +835 -0
  92. package/dist/chunk-stgj6y85.js.map +19 -0
  93. package/dist/chunk-t3tqmxyj.js +42 -0
  94. package/dist/chunk-t3tqmxyj.js.map +9 -0
  95. package/dist/chunk-v8ak35zd.js +94 -0
  96. package/dist/chunk-v8ak35zd.js.map +10 -0
  97. package/dist/chunk-w9acw256.js +167 -0
  98. package/dist/chunk-w9acw256.js.map +10 -0
  99. package/dist/chunk-wq60thjn.js +167 -0
  100. package/dist/chunk-wq60thjn.js.map +10 -0
  101. package/dist/chunk-wzkdeb8a.js +736 -0
  102. package/dist/chunk-wzkdeb8a.js.map +16 -0
  103. package/dist/chunk-xxv6j815.js +256 -0
  104. package/dist/chunk-xxv6j815.js.map +11 -0
  105. package/dist/chunk-yjnj35q8.js +1495 -0
  106. package/dist/chunk-yjnj35q8.js.map +23 -0
  107. package/dist/chunk-yvzzrczy.js +45206 -0
  108. package/dist/chunk-yvzzrczy.js.map +258 -0
  109. package/dist/chunk-ywax1akt.js +370 -0
  110. package/dist/chunk-ywax1akt.js.map +16 -0
  111. package/dist/chunk-zakq9pc0.js +4989 -0
  112. package/dist/chunk-zakq9pc0.js.map +65 -0
  113. package/dist/commands/doctor/command.js +1 -1
  114. package/dist/commands/doctor/steps/AdcProjectCheckStep.d.ts +8 -0
  115. package/dist/commands/init/command.js +1 -1
  116. package/dist/commands/logout/command.js +1 -1
  117. package/dist/commands/proxy/command.js +1 -1
  118. package/dist/commands/screens/command.js +2 -2
  119. package/dist/commands/serve/command.js +3 -3
  120. package/dist/commands/site/command.js +1 -1
  121. package/dist/commands/snapshot/command.js +1 -1
  122. package/dist/commands/tool/command.js +1 -1
  123. package/dist/commands/view/command.js +1 -1
  124. package/dist/index.js +4 -4
  125. package/dist/lib/server/AssetGateway.d.ts +12 -0
  126. package/package.json +1 -1
@@ -0,0 +1,109 @@
1
+ import {
2
+ StitchToolClient
3
+ } from "./chunk-dmrahbs1.js";
4
+ import"./chunk-c6ge431q.js";
5
+ import"./chunk-9wyra8hs.js";
6
+
7
+ // src/services/view/handler.ts
8
+ class ViewHandler {
9
+ client;
10
+ constructor(client = new StitchToolClient) {
11
+ this.client = client;
12
+ }
13
+ async execute(input) {
14
+ try {
15
+ let data;
16
+ if (input.projects) {
17
+ data = await this.client.callTool("list_projects", {});
18
+ } else if (input.name) {
19
+ const projectMatch = input.name.match(/^projects\/([^/]+)$/);
20
+ const screenMatch = input.name.match(/^projects\/([^/]+)\/screens\/([^/]+)$/);
21
+ if (screenMatch) {
22
+ data = await this.client.callTool("get_screen", {
23
+ projectId: screenMatch[1],
24
+ screenId: screenMatch[2]
25
+ });
26
+ } else if (projectMatch) {
27
+ data = await this.client.callTool("get_project", {
28
+ name: `projects/${projectMatch[1]}`
29
+ });
30
+ } else {
31
+ throw new Error(`Invalid resource name format: ${input.name}`);
32
+ }
33
+ } else if (input.sourceScreen) {
34
+ const screenMatch = input.sourceScreen.match(/^projects\/([^/]+)\/screens\/([^/]+)$/);
35
+ if (screenMatch) {
36
+ data = await this.client.callTool("get_screen", {
37
+ projectId: screenMatch[1],
38
+ screenId: screenMatch[2]
39
+ });
40
+ } else {
41
+ throw new Error(`Invalid sourceScreen format: ${input.sourceScreen}`);
42
+ }
43
+ } else if (input.project && input.screen) {
44
+ data = await this.client.callTool("get_screen", {
45
+ projectId: input.project,
46
+ screenId: input.screen
47
+ });
48
+ } else if (input.project) {
49
+ data = await this.client.callTool("get_project", {
50
+ name: `projects/${input.project}`
51
+ });
52
+ } else {
53
+ return {
54
+ success: false,
55
+ error: {
56
+ code: "INVALID_ARGS",
57
+ message: "No valid view arguments provided. Use --projects, --name, --sourceScreen, or --project.",
58
+ recoverable: false
59
+ }
60
+ };
61
+ }
62
+ if (data && data.contents && Array.isArray(data.contents)) {
63
+ const contents = data.contents;
64
+ const chunkSize = 1000;
65
+ const results = [];
66
+ for (let i = 0;i < contents.length; i += chunkSize) {
67
+ const chunk = contents.slice(i, i + chunkSize).map((c) => {
68
+ if (c.text) {
69
+ try {
70
+ const parsed = JSON.parse(c.text);
71
+ return { ...c, text: undefined, data: parsed };
72
+ } catch {
73
+ return c;
74
+ }
75
+ }
76
+ return c;
77
+ });
78
+ results.push(...chunk);
79
+ if (i + chunkSize < contents.length) {
80
+ await new Promise((resolve) => setImmediate(resolve));
81
+ }
82
+ }
83
+ data.contents = results;
84
+ }
85
+ return {
86
+ success: true,
87
+ data
88
+ };
89
+ } catch (error) {
90
+ return {
91
+ success: false,
92
+ error: {
93
+ code: "FETCH_FAILED",
94
+ message: error instanceof Error ? error.message : String(error),
95
+ recoverable: false
96
+ }
97
+ };
98
+ } finally {
99
+ try {
100
+ await this.client.close();
101
+ } catch {}
102
+ }
103
+ }
104
+ }
105
+ export {
106
+ ViewHandler
107
+ };
108
+
109
+ //# debugId=A85DAE0695978F2964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/view/handler.ts"],
4
+ "sourcesContent": [
5
+ "import { type ViewSpec, type ViewInput, type ViewResult } from './spec.js';\nimport { StitchToolClient } from '@google/stitch-sdk';\n\nexport class ViewHandler implements ViewSpec {\n constructor(private readonly client = new StitchToolClient()) {}\n\n async execute(input: ViewInput): Promise<ViewResult> {\n try {\n let data: any;\n\n if (input.projects) {\n data = await this.client.callTool('list_projects', {});\n } else if (input.name) {\n // Parse the resource name to determine the correct tool call\n // Format: \"projects/{id}\" or \"projects/{id}/screens/{screenId}\"\n const projectMatch = input.name.match(/^projects\\/([^/]+)$/);\n const screenMatch = input.name.match(/^projects\\/([^/]+)\\/screens\\/([^/]+)$/);\n\n if (screenMatch) {\n data = await this.client.callTool('get_screen', {\n projectId: screenMatch[1],\n screenId: screenMatch[2]\n });\n } else if (projectMatch) {\n data = await this.client.callTool('get_project', {\n name: `projects/${projectMatch[1]}`\n });\n } else {\n throw new Error(`Invalid resource name format: ${input.name}`);\n }\n } else if (input.sourceScreen) {\n const screenMatch = input.sourceScreen.match(/^projects\\/([^/]+)\\/screens\\/([^/]+)$/);\n if (screenMatch) {\n data = await this.client.callTool('get_screen', {\n projectId: screenMatch[1],\n screenId: screenMatch[2]\n });\n } else {\n throw new Error(`Invalid sourceScreen format: ${input.sourceScreen}`);\n }\n } else if (input.project && input.screen) {\n data = await this.client.callTool('get_screen', {\n projectId: input.project,\n screenId: input.screen\n });\n } else if (input.project) {\n data = await this.client.callTool('get_project', {\n name: `projects/${input.project}`\n });\n } else {\n return {\n success: false,\n error: {\n code: 'INVALID_ARGS',\n message: 'No valid view arguments provided. Use --projects, --name, --sourceScreen, or --project.',\n recoverable: false,\n },\n };\n }\n\n // Pre-process data for better viewing experience\n // If it's an MCP ReadResource result, it has a 'contents' array.\n // We try to parse 'text' fields as JSON.\n if (data && data.contents && Array.isArray(data.contents)) {\n const contents = data.contents;\n const chunkSize = 1000;\n const results = [];\n\n for (let i = 0; i < contents.length; i += chunkSize) {\n const chunk = contents.slice(i, i + chunkSize).map((c: any) => {\n if (c.text) {\n try {\n // Try to parse the text as JSON\n const parsed = JSON.parse(c.text);\n // If successful, replace text with the parsed object for the viewer\n // or add it as a new field. Replacing makes the tree view immediate.\n return { ...c, text: undefined, data: parsed };\n } catch {\n // Not JSON, keep as is\n return c;\n }\n }\n return c;\n });\n results.push(...chunk);\n\n // Yield to the event loop between chunks\n if (i + chunkSize < contents.length) {\n await new Promise(resolve => setImmediate(resolve));\n }\n }\n data.contents = results;\n }\n\n return {\n success: true,\n data: data,\n };\n\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'FETCH_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n } finally {\n // Ensure we close the client connection\n try {\n await this.client.close();\n } catch {}\n }\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "A85DAE0695978F2964756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,137 @@
1
+ import {
2
+ icons,
3
+ theme
4
+ } from "./chunk-kbtqrkwh.js";
5
+ import"./chunk-3sfn889r.js";
6
+ import {
7
+ __require
8
+ } from "./chunk-9wyra8hs.js";
9
+
10
+ // src/commands/view/handler.ts
11
+ class ViewCommandHandler {
12
+ async execute(options) {
13
+ if (options.serve) {
14
+ await this.executeServeMode(options);
15
+ } else {
16
+ await this.executeInteractiveMode(options);
17
+ }
18
+ }
19
+ async executeServeMode(options) {
20
+ if (!options.screen && !options.sourceScreen && !options.name) {
21
+ console.error(theme.red("Error: --serve requires a screen to be specified via --screen, --sourceScreen, or --name"));
22
+ process.exit(1);
23
+ }
24
+ const { ViewHandler } = await import("./chunk-f5f6ekgp.js");
25
+ const handler = new ViewHandler;
26
+ const execOptions = { projects: false };
27
+ if (options.project)
28
+ execOptions.project = options.project;
29
+ if (options.screen)
30
+ execOptions.screen = options.screen;
31
+ if (options.sourceScreen)
32
+ execOptions.sourceScreen = options.sourceScreen;
33
+ if (options.name)
34
+ execOptions.name = options.name;
35
+ const res = await handler.execute(execOptions);
36
+ if (!res.success)
37
+ throw new Error(res.error.message);
38
+ const resource = res.data;
39
+ if (!resource) {
40
+ throw new Error("Could not find resource");
41
+ }
42
+ if (!resource.htmlCode || !resource.htmlCode.downloadUrl) {
43
+ console.error(theme.red("Error: The specified resource is not a screen or has no HTML code."));
44
+ process.exit(1);
45
+ }
46
+ const { StitchViteServer } = await import("./chunk-kva47mgc.js");
47
+ const { downloadText } = await import("./chunk-nzv6abbc.js");
48
+ const server = new StitchViteServer;
49
+ const url = await server.start(0);
50
+ console.log(theme.green(`Starting server at ${url}`));
51
+ console.log("Downloading content...");
52
+ const html = await downloadText(resource.htmlCode.downloadUrl);
53
+ server.mount("/", html);
54
+ console.log(theme.green(`Serving screen "${resource.title || "Screen"}" at ${url}/`));
55
+ console.log("Press Ctrl+C to stop.");
56
+ await new Promise(() => {});
57
+ }
58
+ async executeInteractiveMode(options) {
59
+ const { render } = await import("./chunk-t092ehvp.js");
60
+ const React = await import("./chunk-edp6faw2.js");
61
+ const { InteractiveViewer } = await import("./chunk-d8nttd6z.js");
62
+ const { ViewHandler } = await import("./chunk-f5f6ekgp.js");
63
+ const handler = new ViewHandler;
64
+ const result = await handler.execute({
65
+ projects: options.projects,
66
+ name: options.name,
67
+ sourceScreen: options.sourceScreen,
68
+ project: options.project,
69
+ screen: options.screen
70
+ });
71
+ if (!result.success) {
72
+ console.error(theme.red(`
73
+ ${icons.error} View failed: ${result.error.message}`));
74
+ process.exit(1);
75
+ }
76
+ const createElement = React.createElement || React.default.createElement;
77
+ let rootLabel;
78
+ if (options.sourceScreen) {
79
+ rootLabel = "screen";
80
+ } else if (options.name) {
81
+ rootLabel = "resource";
82
+ }
83
+ const fetchResource = async (resourceName) => {
84
+ if (resourceName.includes("/screens/")) {
85
+ const navResult = await handler.execute({ projects: false, sourceScreen: resourceName });
86
+ if (!navResult.success)
87
+ throw new Error(navResult.error.message);
88
+ return navResult.data;
89
+ } else {
90
+ const navResult = await handler.execute({ projects: false, name: resourceName });
91
+ if (!navResult.success)
92
+ throw new Error(navResult.error.message);
93
+ return navResult.data;
94
+ }
95
+ };
96
+ const initialHistory = [];
97
+ if (options.sourceScreen) {
98
+ const projectMatch = options.sourceScreen.match(/^(projects\/\d+)/);
99
+ if (projectMatch) {
100
+ const projectName = projectMatch[1];
101
+ try {
102
+ const projectsResult = await handler.execute({ projects: true });
103
+ if (projectsResult.success) {
104
+ initialHistory.push({ data: projectsResult.data, rootLabel: undefined });
105
+ }
106
+ } catch (e) {}
107
+ try {
108
+ const projectResult = await handler.execute({ projects: false, name: projectName });
109
+ if (projectResult.success) {
110
+ initialHistory.push({ data: projectResult.data, rootLabel: "resource", resourcePath: projectName });
111
+ }
112
+ } catch (e) {}
113
+ }
114
+ }
115
+ if (options.name && !options.sourceScreen) {
116
+ try {
117
+ const projectsResult = await handler.execute({ projects: true });
118
+ if (projectsResult.success) {
119
+ initialHistory.push({ data: projectsResult.data, rootLabel: undefined });
120
+ }
121
+ } catch (e) {}
122
+ }
123
+ const instance = render(createElement(InteractiveViewer, {
124
+ initialData: result.data,
125
+ initialRootLabel: rootLabel,
126
+ initialHistory: initialHistory.length > 0 ? initialHistory : undefined,
127
+ onFetch: fetchResource
128
+ }));
129
+ await instance.waitUntilExit();
130
+ process.exit(0);
131
+ }
132
+ }
133
+ export {
134
+ ViewCommandHandler
135
+ };
136
+
137
+ //# debugId=FACA0134243A0F2764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/view/handler.ts"],
4
+ "sourcesContent": [
5
+ "import { theme, icons } from '../../ui/theme.js';\n\ninterface ViewOptions {\n projects: boolean;\n name?: string;\n sourceScreen?: string;\n project?: string;\n screen?: string;\n serve: boolean;\n}\n\nexport class ViewCommandHandler {\n async execute(options: ViewOptions): Promise<void> {\n if (options.serve) {\n await this.executeServeMode(options);\n } else {\n await this.executeInteractiveMode(options);\n }\n }\n\n private async executeServeMode(options: ViewOptions): Promise<void> {\n if (!options.screen && !options.sourceScreen && !options.name) {\n console.error(theme.red('Error: --serve requires a screen to be specified via --screen, --sourceScreen, or --name'));\n process.exit(1);\n }\n\n const { ViewHandler } = await import('../../services/view/handler.js');\n const handler = new ViewHandler();\n\n const execOptions: any = { projects: false };\n if (options.project) execOptions.project = options.project;\n if (options.screen) execOptions.screen = options.screen;\n if (options.sourceScreen) execOptions.sourceScreen = options.sourceScreen;\n if (options.name) execOptions.name = options.name;\n\n const res = await handler.execute(execOptions);\n if (!res.success) throw new Error(res.error.message);\n\n const resource = res.data;\n if (!resource) {\n throw new Error('Could not find resource');\n }\n\n if (!resource.htmlCode || !resource.htmlCode.downloadUrl) {\n console.error(theme.red('Error: The specified resource is not a screen or has no HTML code.'));\n process.exit(1);\n }\n\n const { StitchViteServer } = await import('../../lib/server/vite/StitchViteServer.js');\n const { downloadText } = await import('../../ui/copy-behaviors/clipboard.js');\n\n const server = new StitchViteServer();\n const url = await server.start(0);\n console.log(theme.green(`Starting server at ${url}`));\n\n console.log('Downloading content...');\n const html = await downloadText(resource.htmlCode.downloadUrl);\n server.mount('/', html);\n\n console.log(theme.green(`Serving screen \"${resource.title || 'Screen'}\" at ${url}/`));\n console.log('Press Ctrl+C to stop.');\n\n await new Promise(() => {});\n }\n\n private async executeInteractiveMode(options: ViewOptions): Promise<void> {\n const { render } = await import('ink');\n const React = await import('react');\n const { InteractiveViewer } = await import('../../ui/InteractiveViewer.js');\n const { ViewHandler } = await import('../../services/view/handler.js');\n\n const handler = new ViewHandler();\n const result = await handler.execute({\n projects: options.projects,\n name: options.name,\n sourceScreen: options.sourceScreen,\n project: options.project,\n screen: options.screen,\n });\n\n if (!result.success) {\n console.error(theme.red(`\\n${icons.error} View failed: ${result.error.message}`));\n process.exit(1);\n }\n\n const createElement = React.createElement || (React.default as any).createElement;\n\n let rootLabel: string | undefined;\n if (options.sourceScreen) {\n rootLabel = 'screen';\n } else if (options.name) {\n rootLabel = 'resource';\n }\n\n const fetchResource = async (resourceName: string): Promise<any> => {\n if (resourceName.includes('/screens/')) {\n const navResult = await handler.execute({ projects: false, sourceScreen: resourceName });\n if (!navResult.success) throw new Error(navResult.error.message);\n return navResult.data;\n } else {\n const navResult = await handler.execute({ projects: false, name: resourceName });\n if (!navResult.success) throw new Error(navResult.error.message);\n return navResult.data;\n }\n };\n\n const initialHistory: Array<{ data: any; rootLabel?: string; resourcePath?: string }> = [];\n\n if (options.sourceScreen) {\n const projectMatch = options.sourceScreen.match(/^(projects\\/\\d+)/);\n if (projectMatch) {\n const projectName = projectMatch[1];\n try {\n const projectsResult = await handler.execute({ projects: true });\n if (projectsResult.success) {\n initialHistory.push({ data: projectsResult.data, rootLabel: undefined });\n }\n } catch (e) {}\n\n try {\n const projectResult = await handler.execute({ projects: false, name: projectName });\n if (projectResult.success) {\n initialHistory.push({ data: projectResult.data, rootLabel: 'resource', resourcePath: projectName });\n }\n } catch (e) {}\n }\n }\n\n if (options.name && !options.sourceScreen) {\n try {\n const projectsResult = await handler.execute({ projects: true });\n if (projectsResult.success) {\n initialHistory.push({ data: projectsResult.data, rootLabel: undefined });\n }\n } catch (e) {}\n }\n\n const instance = render(createElement(InteractiveViewer, {\n initialData: result.data,\n initialRootLabel: rootLabel,\n initialHistory: initialHistory.length > 0 ? initialHistory : undefined,\n onFetch: fetchResource,\n }));\n await instance.waitUntilExit();\n process.exit(0);\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "FACA0134243A0F2764756E2164756E21",
9
+ "names": []
10
+ }