@hs-x/cli 0.3.6 → 0.4.0

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 (211) hide show
  1. package/README.md +126 -0
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +58 -59
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/kit.d.ts.map +1 -1
  6. package/dist/cli/kit.js +1 -1
  7. package/dist/cli/kit.js.map +1 -1
  8. package/dist/cloudflare-auth.d.ts +19 -0
  9. package/dist/cloudflare-auth.d.ts.map +1 -1
  10. package/dist/cloudflare-auth.js +83 -2
  11. package/dist/cloudflare-auth.js.map +1 -1
  12. package/dist/cloudflare-oauth.d.ts.map +1 -1
  13. package/dist/cloudflare-oauth.js +18 -19
  14. package/dist/cloudflare-oauth.js.map +1 -1
  15. package/dist/cloudflare-scoped-resource.d.ts +41 -0
  16. package/dist/cloudflare-scoped-resource.d.ts.map +1 -0
  17. package/dist/cloudflare-scoped-resource.js +74 -0
  18. package/dist/cloudflare-scoped-resource.js.map +1 -0
  19. package/dist/command-catalog.d.ts +13 -0
  20. package/dist/command-catalog.d.ts.map +1 -0
  21. package/dist/command-catalog.js +50 -0
  22. package/dist/command-catalog.js.map +1 -0
  23. package/dist/commands/completion.d.ts.map +1 -1
  24. package/dist/commands/completion.js +287 -47
  25. package/dist/commands/completion.js.map +1 -1
  26. package/dist/commands/connect.d.ts.map +1 -1
  27. package/dist/commands/connect.js +274 -38
  28. package/dist/commands/connect.js.map +1 -1
  29. package/dist/commands/control-plane-read.d.ts +31 -3
  30. package/dist/commands/control-plane-read.d.ts.map +1 -1
  31. package/dist/commands/control-plane-read.js +136 -37
  32. package/dist/commands/control-plane-read.js.map +1 -1
  33. package/dist/commands/deploy-retry.d.ts +20 -0
  34. package/dist/commands/deploy-retry.d.ts.map +1 -0
  35. package/dist/commands/deploy-retry.js +106 -0
  36. package/dist/commands/deploy-retry.js.map +1 -0
  37. package/dist/commands/deploy.d.ts +16 -8
  38. package/dist/commands/deploy.d.ts.map +1 -1
  39. package/dist/commands/deploy.js +1027 -373
  40. package/dist/commands/deploy.js.map +1 -1
  41. package/dist/commands/dev.d.ts +19 -1
  42. package/dist/commands/dev.d.ts.map +1 -1
  43. package/dist/commands/dev.js +1378 -88
  44. package/dist/commands/dev.js.map +1 -1
  45. package/dist/commands/doctor.d.ts.map +1 -1
  46. package/dist/commands/doctor.js +27 -10
  47. package/dist/commands/doctor.js.map +1 -1
  48. package/dist/commands/flags.d.ts +9 -4
  49. package/dist/commands/flags.d.ts.map +1 -1
  50. package/dist/commands/flags.js +208 -80
  51. package/dist/commands/flags.js.map +1 -1
  52. package/dist/commands/help-command.d.ts.map +1 -1
  53. package/dist/commands/help-command.js +177 -86
  54. package/dist/commands/help-command.js.map +1 -1
  55. package/dist/commands/init.d.ts.map +1 -1
  56. package/dist/commands/init.js +5 -0
  57. package/dist/commands/init.js.map +1 -1
  58. package/dist/commands/link.d.ts.map +1 -1
  59. package/dist/commands/link.js +74 -15
  60. package/dist/commands/link.js.map +1 -1
  61. package/dist/commands/project.d.ts +107 -0
  62. package/dist/commands/project.d.ts.map +1 -0
  63. package/dist/commands/project.js +586 -0
  64. package/dist/commands/project.js.map +1 -0
  65. package/dist/commands/secrets.d.ts +2 -2
  66. package/dist/commands/status.d.ts.map +1 -1
  67. package/dist/commands/status.js +15 -5
  68. package/dist/commands/status.js.map +1 -1
  69. package/dist/commands/validate.d.ts +19 -0
  70. package/dist/commands/validate.d.ts.map +1 -1
  71. package/dist/commands/validate.js +26 -7
  72. package/dist/commands/validate.js.map +1 -1
  73. package/dist/constants.d.ts +1 -1
  74. package/dist/constants.js +1 -1
  75. package/dist/control-plane-tenant-provisioning.d.ts +24 -0
  76. package/dist/control-plane-tenant-provisioning.d.ts.map +1 -0
  77. package/dist/control-plane-tenant-provisioning.js +85 -0
  78. package/dist/control-plane-tenant-provisioning.js.map +1 -0
  79. package/dist/deploy-targets.d.ts +24 -0
  80. package/dist/deploy-targets.d.ts.map +1 -0
  81. package/dist/deploy-targets.js +38 -0
  82. package/dist/deploy-targets.js.map +1 -0
  83. package/dist/dev/account-selection.d.ts +16 -0
  84. package/dist/dev/account-selection.d.ts.map +1 -0
  85. package/dist/dev/account-selection.js +22 -0
  86. package/dist/dev/account-selection.js.map +1 -0
  87. package/dist/dev/browser-log-bridge.d.ts +32 -0
  88. package/dist/dev/browser-log-bridge.d.ts.map +1 -0
  89. package/dist/dev/browser-log-bridge.js +156 -0
  90. package/dist/dev/browser-log-bridge.js.map +1 -0
  91. package/dist/dev/compat-shim.d.ts +3 -3
  92. package/dist/dev/compat-shim.d.ts.map +1 -1
  93. package/dist/dev/compat-shim.js +29 -4
  94. package/dist/dev/compat-shim.js.map +1 -1
  95. package/dist/dev/component-selection.d.ts +25 -0
  96. package/dist/dev/component-selection.d.ts.map +1 -0
  97. package/dist/dev/component-selection.js +79 -0
  98. package/dist/dev/component-selection.js.map +1 -0
  99. package/dist/dev/console-capture.d.ts +18 -0
  100. package/dist/dev/console-capture.d.ts.map +1 -0
  101. package/dist/dev/console-capture.js +57 -0
  102. package/dist/dev/console-capture.js.map +1 -0
  103. package/dist/dev/event-bus.d.ts +1 -1
  104. package/dist/dev/event-bus.js +1 -1
  105. package/dist/dev/frontend-log-relay.d.ts +27 -0
  106. package/dist/dev/frontend-log-relay.d.ts.map +1 -0
  107. package/dist/dev/frontend-log-relay.js +102 -0
  108. package/dist/dev/frontend-log-relay.js.map +1 -0
  109. package/dist/dev/invoke.d.ts +3 -4
  110. package/dist/dev/invoke.d.ts.map +1 -1
  111. package/dist/dev/invoke.js +9 -4
  112. package/dist/dev/invoke.js.map +1 -1
  113. package/dist/dev/keyboard.d.ts +1 -0
  114. package/dist/dev/keyboard.d.ts.map +1 -1
  115. package/dist/dev/keyboard.js +9 -3
  116. package/dist/dev/keyboard.js.map +1 -1
  117. package/dist/dev/log-server.js +3 -0
  118. package/dist/dev/log-server.js.map +1 -1
  119. package/dist/dev/loopback-http-listener.d.ts +18 -0
  120. package/dist/dev/loopback-http-listener.d.ts.map +1 -0
  121. package/dist/dev/loopback-http-listener.js +91 -0
  122. package/dist/dev/loopback-http-listener.js.map +1 -0
  123. package/dist/dev/managed-session.d.ts +124 -0
  124. package/dist/dev/managed-session.d.ts.map +1 -0
  125. package/dist/dev/managed-session.js +597 -0
  126. package/dist/dev/managed-session.js.map +1 -0
  127. package/dist/dev/port-process.d.ts +21 -0
  128. package/dist/dev/port-process.d.ts.map +1 -0
  129. package/dist/dev/port-process.js +145 -0
  130. package/dist/dev/port-process.js.map +1 -0
  131. package/dist/dev/session-manager.d.ts +11 -1
  132. package/dist/dev/session-manager.d.ts.map +1 -1
  133. package/dist/dev/session-manager.js +65 -14
  134. package/dist/dev/session-manager.js.map +1 -1
  135. package/dist/dev/stream-event-format.d.ts +14 -0
  136. package/dist/dev/stream-event-format.d.ts.map +1 -0
  137. package/dist/dev/stream-event-format.js +262 -0
  138. package/dist/dev/stream-event-format.js.map +1 -0
  139. package/dist/dev/stream-filter.d.ts.map +1 -1
  140. package/dist/dev/stream-filter.js +16 -1
  141. package/dist/dev/stream-filter.js.map +1 -1
  142. package/dist/dev/stream-renderer.d.ts +4 -2
  143. package/dist/dev/stream-renderer.d.ts.map +1 -1
  144. package/dist/dev/stream-renderer.js +224 -84
  145. package/dist/dev/stream-renderer.js.map +1 -1
  146. package/dist/errors-registry.d.ts.map +1 -1
  147. package/dist/errors-registry.js +246 -0
  148. package/dist/errors-registry.js.map +1 -1
  149. package/dist/help.d.ts.map +1 -1
  150. package/dist/help.js +20 -3
  151. package/dist/help.js.map +1 -1
  152. package/dist/hubspot-app-logs.d.ts +38 -5
  153. package/dist/hubspot-app-logs.d.ts.map +1 -1
  154. package/dist/hubspot-app-logs.js +88 -17
  155. package/dist/hubspot-app-logs.js.map +1 -1
  156. package/dist/hubspot-auth.d.ts +19 -1
  157. package/dist/hubspot-auth.d.ts.map +1 -1
  158. package/dist/hubspot-auth.js +228 -83
  159. package/dist/hubspot-auth.js.map +1 -1
  160. package/dist/hubspot-developer-client.d.ts +87 -0
  161. package/dist/hubspot-developer-client.d.ts.map +1 -1
  162. package/dist/hubspot-developer-client.js +232 -1
  163. package/dist/hubspot-developer-client.js.map +1 -1
  164. package/dist/hubspot-project-archive.d.ts +21 -0
  165. package/dist/hubspot-project-archive.d.ts.map +1 -0
  166. package/dist/hubspot-project-archive.js +281 -0
  167. package/dist/hubspot-project-archive.js.map +1 -0
  168. package/dist/hubspot-project.d.ts +32 -0
  169. package/dist/hubspot-project.d.ts.map +1 -0
  170. package/dist/hubspot-project.js +269 -0
  171. package/dist/hubspot-project.js.map +1 -0
  172. package/dist/local-project-picker.js +1 -1
  173. package/dist/local-project-picker.js.map +1 -1
  174. package/dist/machine-artifact.d.ts +16 -0
  175. package/dist/machine-artifact.d.ts.map +1 -0
  176. package/dist/machine-artifact.js +18 -0
  177. package/dist/machine-artifact.js.map +1 -0
  178. package/dist/machine-id.d.ts +15 -0
  179. package/dist/machine-id.d.ts.map +1 -1
  180. package/dist/machine-id.js +53 -0
  181. package/dist/machine-id.js.map +1 -1
  182. package/dist/mutation-consent.d.ts +20 -0
  183. package/dist/mutation-consent.d.ts.map +1 -0
  184. package/dist/mutation-consent.js +9 -0
  185. package/dist/mutation-consent.js.map +1 -0
  186. package/dist/output-context.d.ts +3 -0
  187. package/dist/output-context.d.ts.map +1 -1
  188. package/dist/output-context.js +7 -1
  189. package/dist/output-context.js.map +1 -1
  190. package/dist/prompt.d.ts.map +1 -1
  191. package/dist/prompt.js +123 -48
  192. package/dist/prompt.js.map +1 -1
  193. package/dist/reporter/index.js +1 -1
  194. package/dist/reporter/index.js.map +1 -1
  195. package/dist/reporter/style.d.ts.map +1 -1
  196. package/dist/reporter/style.js +5 -0
  197. package/dist/reporter/style.js.map +1 -1
  198. package/dist/services/hubspot-dev-client.js +3 -0
  199. package/dist/services/hubspot-dev-client.js.map +1 -1
  200. package/dist/services/telemetry.d.ts +1 -2
  201. package/dist/services/telemetry.d.ts.map +1 -1
  202. package/dist/services/telemetry.js +1 -10
  203. package/dist/services/telemetry.js.map +1 -1
  204. package/dist/telemetry.d.ts.map +1 -1
  205. package/dist/telemetry.js +1 -7
  206. package/dist/telemetry.js.map +1 -1
  207. package/dist/tenant-data-plane-provisioning.d.ts +35 -0
  208. package/dist/tenant-data-plane-provisioning.d.ts.map +1 -0
  209. package/dist/tenant-data-plane-provisioning.js +38 -0
  210. package/dist/tenant-data-plane-provisioning.js.map +1 -0
  211. package/package.json +14 -12
@@ -0,0 +1,156 @@
1
+ import { existsSync, readFileSync, watch, writeFileSync } from 'node:fs';
2
+ import { join, parse } from 'node:path';
3
+ const BRIDGE_MARKER = '/*__HSX_DEV_BROWSER_LOG_BRIDGE_V3__*/';
4
+ const PREVIOUS_BRIDGE_MARKERS = [
5
+ '/*__HSX_DEV_BROWSER_LOG_BRIDGE_V2__*/',
6
+ '/*__HSX_DEV_BROWSER_LOG_BRIDGE__*/',
7
+ ];
8
+ const LEGACY_BRIDGE_END = '}catch{}})();';
9
+ const HUBSPOT_UI_EXTENSION_TYPES = new Set(['CARD', 'SETTINGS', 'PAGE', 'CRM_BULK_ACTION']);
10
+ /**
11
+ * Adds a development-only bootstrap to HubSpot's generated UI-extension IIFE.
12
+ * The customer's source tree is never rewritten and production builds never
13
+ * see this code. Keeping the bootstrap on the first generated line preserves
14
+ * inline source-map line offsets for the actual extension code.
15
+ */
16
+ export function injectBrowserLogBridge(bundle, input) {
17
+ if (bundle.includes(BRIDGE_MARKER))
18
+ return bundle;
19
+ return `${browserLogBridgePrelude(input)}${removePreviousBridge(bundle)}`;
20
+ }
21
+ /** Exported for focused VM/browser-shape tests. */
22
+ export function browserLogBridgePrelude(input) {
23
+ const relayFunctionName = JSON.stringify(input.relayFunctionName);
24
+ const source = JSON.stringify(input.source);
25
+ // Deliberately emitted as one line: prepending a generated line would shift
26
+ // every Vite source-map mapping. The bridge mirrors calls after preserving
27
+ // the original browser/HubSpot logger behavior and never throws into the app.
28
+ return `${BRIDGE_MARKER}(()=>{try{const g=globalThis;if(g.__HSX_DEV_BROWSER_LOG_BRIDGE_V3__)return;if(g.__HSX_DEV_BROWSER_LOG_BRIDGE_V2__){Object.defineProperty(g,"__HSX_DEV_BROWSER_LOG_BRIDGE_V3__",{value:true,configurable:true});return}Object.defineProperty(g,"__HSX_DEV_BROWSER_LOG_BRIDGE_V3__",{value:true,configurable:true});const relayFunctionName=${relayFunctionName},source=${source},queue=[];let timer,insideLogger=0;const levelOf=n=>n==="error"?"error":n==="warn"?"warn":n==="debug"?"debug":"info";const normalize=value=>{if(value instanceof Error)return{name:value.name,message:value.message,stack:value.stack};const seen=new WeakSet;try{const json=JSON.stringify(value,(_key,item)=>{if(typeof item==="undefined")return "[undefined]";if(typeof item==="bigint")return String(item)+"n";if(typeof item==="function")return "[Function "+(item.name||"anonymous")+"]";if(typeof item==="symbol")return String(item);if(item&&typeof item==="object"){if(seen.has(item))return "[Circular]";seen.add(item)}return item});return json===undefined?String(value):JSON.parse(json)}catch{return String(value)}};const render=value=>{if(typeof value==="string")return value;if(typeof value==="undefined")return "undefined";if(value instanceof Error)return value.stack||value.message;const normalized=normalize(value);return typeof normalized==="string"?normalized:JSON.stringify(normalized)};const flush=()=>{timer=undefined;if(queue.length===0)return;const batch=queue.splice(0,100);try{const send=g.serverless;if(typeof send==="function")void Promise.resolve(Reflect.apply(send,g,[relayFunctionName,{parameters:{entries:batch}}])).catch(()=>{})}catch{}if(queue.length>0)timer=setTimeout(flush,0)};const emit=(level,args,api)=>{try{const msg=args.map(render).join(" ").slice(0,65536);if(!msg)return;const fields={api};if(args.some(value=>value!==null&&typeof value==="object")){const normalizedArgs=args.map(normalize);if(JSON.stringify(normalizedArgs).length<=65536)fields.args=normalizedArgs}queue.push({level,msg,ts:Date.now(),source,fields});if(queue.length>=100)flush();else if(timer===undefined)timer=setTimeout(flush,100)}catch{}};const wrap=(target,name,kind)=>{try{const original=target?.[name];if(typeof original!=="function")return;target[name]=function(...args){if(kind==="console"&&insideLogger>0)return original.apply(this,args);let result;if(kind==="logger")insideLogger++;try{result=original.apply(this,args)}finally{if(kind==="logger")insideLogger--}emit(levelOf(name),args,kind+"."+name);return result}}catch{}};for(const name of ["log","info","debug","warn","error"])wrap(g.console,name,"console");if(g.logger&&typeof g.logger==="object")for(const name of ["info","debug","warn","error"])wrap(g.logger,name,"logger");if(typeof g.serverless==="function")emit("debug",["frontend log relay active"],"hsx.bridge")}catch{}})();`;
29
+ }
30
+ export function createHubSpotDevBrowserLogInstrumentor(input) {
31
+ const outputDir = resolveOutputDir(input.nodesByUid);
32
+ const targets = resolveTargets(input.nodesByUid);
33
+ const patchBundles = () => {
34
+ if (!outputDir)
35
+ return 0;
36
+ let patched = 0;
37
+ for (const target of targets) {
38
+ const bundlePath = join(outputDir, target.filename);
39
+ if (!existsSync(bundlePath))
40
+ continue;
41
+ try {
42
+ const before = readFileSync(bundlePath, 'utf8');
43
+ const after = injectBrowserLogBridge(before, {
44
+ relayFunctionName: input.relayFunctionName,
45
+ source: target.source,
46
+ });
47
+ if (after !== before) {
48
+ writeFileSync(bundlePath, after);
49
+ patched += 1;
50
+ }
51
+ }
52
+ catch {
53
+ // Logging is additive. A bundle that cannot be instrumented must not
54
+ // prevent the underlying HubSpot dev session from starting or updating.
55
+ }
56
+ }
57
+ return patched;
58
+ };
59
+ return {
60
+ logger: wrapHubSpotDevLogger(input.logger, patchBundles),
61
+ ...(outputDir ? { outputDir } : {}),
62
+ targets,
63
+ patchBundles,
64
+ watchBundles() {
65
+ if (!outputDir || !existsSync(outputDir))
66
+ return () => { };
67
+ let watcher;
68
+ let timer;
69
+ try {
70
+ watcher = watch(outputDir, { persistent: false }, (_event, filename) => {
71
+ if (filename && !targets.some((target) => target.filename === String(filename)))
72
+ return;
73
+ if (timer)
74
+ clearTimeout(timer);
75
+ timer = setTimeout(() => {
76
+ timer = undefined;
77
+ patchBundles();
78
+ }, 10);
79
+ timer.unref?.();
80
+ });
81
+ }
82
+ catch {
83
+ return () => { };
84
+ }
85
+ return () => {
86
+ if (timer)
87
+ clearTimeout(timer);
88
+ watcher?.close();
89
+ };
90
+ },
91
+ };
92
+ }
93
+ function wrapHubSpotDevLogger(logger, patchBundles) {
94
+ if (!logger || typeof logger !== 'object')
95
+ return logger;
96
+ return new Proxy(logger, {
97
+ get(target, property, receiver) {
98
+ const value = Reflect.get(target, property, receiver);
99
+ if (property !== 'info' || typeof value !== 'function')
100
+ return value;
101
+ return (...args) => {
102
+ // HubSpot logs this immediately before broadcasting an HMR update.
103
+ // Patch synchronously so the browser cannot fetch the fresh bundle in
104
+ // the small window between its write and our instrumentation.
105
+ if (args.some((arg) => typeof arg === 'string' && arg.includes('updated, compiled'))) {
106
+ patchBundles();
107
+ }
108
+ return Reflect.apply(value, target, args);
109
+ };
110
+ },
111
+ });
112
+ }
113
+ function resolveOutputDir(nodesByUid) {
114
+ for (const value of Object.values(nodesByUid)) {
115
+ const node = asRecord(value);
116
+ if (asString(node?.componentType) !== 'APPLICATION')
117
+ continue;
118
+ const componentRoot = asString(asRecord(node?.localDev)?.componentRoot);
119
+ if (componentRoot)
120
+ return join(componentRoot, 'dist');
121
+ }
122
+ return undefined;
123
+ }
124
+ function resolveTargets(nodesByUid) {
125
+ const targets = [];
126
+ for (const [uid, value] of Object.entries(nodesByUid)) {
127
+ const node = asRecord(value);
128
+ const componentType = asString(node?.componentType);
129
+ if (!componentType || !HUBSPOT_UI_EXTENSION_TYPES.has(componentType))
130
+ continue;
131
+ const entrypoint = asString(asRecord(node?.config)?.entrypoint);
132
+ if (!entrypoint)
133
+ continue;
134
+ const filename = encodeURIComponent(`${parse(entrypoint).name}.js`);
135
+ if (!targets.some((target) => target.filename === filename)) {
136
+ targets.push({ filename, source: uid });
137
+ }
138
+ }
139
+ return targets;
140
+ }
141
+ function asRecord(value) {
142
+ return typeof value === 'object' && value !== null
143
+ ? value
144
+ : undefined;
145
+ }
146
+ function asString(value) {
147
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
148
+ }
149
+ function removePreviousBridge(bundle) {
150
+ const marker = PREVIOUS_BRIDGE_MARKERS.find((candidate) => bundle.startsWith(candidate));
151
+ if (!marker)
152
+ return bundle;
153
+ const end = bundle.indexOf(LEGACY_BRIDGE_END, marker.length);
154
+ return end >= 0 ? bundle.slice(end + LEGACY_BRIDGE_END.length) : bundle;
155
+ }
156
+ //# sourceMappingURL=browser-log-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-log-bridge.js","sourceRoot":"","sources":["../../src/dev/browser-log-bridge.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,9 @@
4
4
  * one file.
5
5
  *
6
6
  * Pins (kept in @hs-x/hubspot-cli package.json):
7
- * @hubspot/local-dev-lib 5.7.0
8
- * @hubspot/project-parsing-lib 0.16.0
9
- * @hubspot/ui-extensions-dev-server 2.0.7
7
+ * @hubspot/local-dev-lib 5.10.3
8
+ * @hubspot/project-parsing-lib 0.22.1
9
+ * @hubspot/ui-extensions-dev-server 2.1.2
10
10
  */
11
11
  export interface ProjectIr {
12
12
  readonly intermediateNodesIndexedByUid: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"compat-shim.d.ts","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,KAAK,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC/E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,MAAM,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CA8BtD"}
1
+ {"version":3,"file":"compat-shim.d.ts","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AA4BD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,KAAK,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC/E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,MAAM,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAoCtD"}
@@ -4,10 +4,31 @@
4
4
  * one file.
5
5
  *
6
6
  * Pins (kept in @hs-x/hubspot-cli package.json):
7
- * @hubspot/local-dev-lib 5.7.0
8
- * @hubspot/project-parsing-lib 0.16.0
9
- * @hubspot/ui-extensions-dev-server 2.0.7
7
+ * @hubspot/local-dev-lib 5.10.3
8
+ * @hubspot/project-parsing-lib 0.22.1
9
+ * @hubspot/ui-extensions-dev-server 2.1.2
10
10
  */
11
+ function isRecord(value) {
12
+ return typeof value === 'object' && value !== null;
13
+ }
14
+ /**
15
+ * Current project-parsing-lib releases wrap the local-dev IR in a result
16
+ * envelope so they can also report skipped hsmeta files. Older releases
17
+ * returned the IR directly. Keep the rest of the dev loop insulated from that
18
+ * upstream wire-shape change.
19
+ */
20
+ function normalizeProjectIr(value) {
21
+ const candidate = isRecord(value) && 'intermediateRepresentation' in value
22
+ ? value.intermediateRepresentation
23
+ : value;
24
+ if (!isRecord(candidate) || !isRecord(candidate.intermediateNodesIndexedByUid)) {
25
+ throw new Error('@hubspot/project-parsing-lib returned an invalid local-dev intermediate representation.');
26
+ }
27
+ return {
28
+ intermediateNodesIndexedByUid: candidate.intermediateNodesIndexedByUid,
29
+ profileData: candidate.profileData,
30
+ };
31
+ }
11
32
  export async function loadDevStack() {
12
33
  const portManager = await import('@hubspot/local-dev-lib/portManager');
13
34
  const config = await import('@hubspot/local-dev-lib/config');
@@ -16,8 +37,12 @@ export async function loadDevStack() {
16
37
  const importRuntime = new Function('specifier', 'return import(specifier)');
17
38
  const parsing = await importRuntime('@hubspot/project-parsing-lib/translate');
18
39
  const uie = await import('@hubspot/ui-extensions-dev-server');
40
+ const translateForLocalDev = parsing.translateForLocalDev;
41
+ if (typeof translateForLocalDev !== 'function') {
42
+ throw new Error('@hubspot/project-parsing-lib/translate is missing translateForLocalDev.');
43
+ }
19
44
  return {
20
- translateForLocalDev: parsing.translateForLocalDev,
45
+ translateForLocalDev: async (input, options) => normalizeProjectIr(await translateForLocalDev(input, options)),
21
46
  startPortManagerServer: portManager.startPortManagerServer,
22
47
  stopPortManagerServer: portManager.stopPortManagerServer,
23
48
  getActiveServers: () => portManager.getActiveServers(),
@@ -1 +1 @@
1
- {"version":3,"file":"compat-shim.js","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiCH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAErC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,wCAAwC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAE9D,OAAO;QACL,oBAAoB,EAAE,OAAO,CAAC,oBAAwD;QACtF,sBAAsB,EAAE,WAAW,CAAC,sBAAsB;QAC1D,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;QACxD,gBAAgB,EAAE,GAA0B,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE;QAC7E,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC3D,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;QACnE,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,EAAE,GAAG,CAAC,uBAAuB;QAChC,gBAAgB,EAAE,CAAC,SAAiB,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;gBAC3D,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"compat-shim.js","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,SAAS,GACb,QAAQ,CAAC,KAAK,CAAC,IAAI,4BAA4B,IAAI,KAAK;QACtD,CAAC,CAAC,KAAK,CAAC,0BAA0B;QAClC,CAAC,CAAC,KAAK,CAAC;IACZ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO;QACL,6BAA6B,EAAE,SAAS,CAAC,6BAA6B;QACtE,WAAW,EAAE,SAAS,CAAC,WAAW;KACnC,CAAC;AACJ,CAAC;AA4BD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAErC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,wCAAwC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAE9D,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAC1D,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO;QACL,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAC7C,kBAAkB,CAAC,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,sBAAsB,EAAE,WAAW,CAAC,sBAAsB;QAC1D,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;QACxD,gBAAgB,EAAE,GAA0B,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE;QAC7E,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC3D,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;QACnE,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,GAAG,EAAE,GAAG,CAAC,uBAAuB;QAChC,gBAAgB,EAAE,CAAC,SAAiB,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;gBAC3D,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export declare const HUBSPOT_UI_EXTENSION_TYPES: Set<string>;
2
+ export interface HubSpotDevComponentCandidate {
3
+ readonly uid: string;
4
+ readonly label: string;
5
+ readonly description: string;
6
+ readonly entrypoint?: string;
7
+ }
8
+ export declare function listHubSpotDevComponentCandidates(nodesByUid: Readonly<Record<string, unknown>>): readonly HubSpotDevComponentCandidate[];
9
+ export declare function resolveHubSpotDevComponentSelectors(candidates: readonly HubSpotDevComponentCandidate[], selectors: readonly string[]): {
10
+ readonly ok: true;
11
+ readonly uids: readonly string[];
12
+ } | {
13
+ readonly ok: false;
14
+ readonly message: string;
15
+ };
16
+ /**
17
+ * Keep the selected UI extensions plus the app/function nodes the HubSpot UI
18
+ * dev server needs to construct app metadata and serve `runServerlessFunction`
19
+ * calls. Only the selected UI extensions become browser choices.
20
+ */
21
+ export declare function filterHubSpotDevSessionNodes(nodesByUid: Readonly<Record<string, unknown>>, selectedNodeUids: readonly string[]): {
22
+ readonly nodesByUid: Record<string, unknown>;
23
+ readonly activeNodeUids: readonly string[];
24
+ };
25
+ //# sourceMappingURL=component-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-selection.d.ts","sourceRoot":"","sources":["../../src/dev/component-selection.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,aAA2D,CAAC;AAInG,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC5C,SAAS,4BAA4B,EAAE,CA8BzC;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,SAAS,4BAA4B,EAAE,EACnD,SAAS,EAAE,SAAS,MAAM,EAAE,GAE1B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmBnD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC7C,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAkB9F"}
@@ -0,0 +1,79 @@
1
+ export const HUBSPOT_UI_EXTENSION_TYPES = new Set(['CARD', 'SETTINGS', 'PAGE', 'CRM_BULK_ACTION']);
2
+ const HUBSPOT_UI_SUPPORT_TYPES = new Set(['APPLICATION', 'APP_FUNCTION', 'SERVERLESS_PACKAGE']);
3
+ export function listHubSpotDevComponentCandidates(nodesByUid) {
4
+ const candidates = [];
5
+ for (const [uid, value] of Object.entries(nodesByUid)) {
6
+ const node = asRecord(value);
7
+ const componentType = asString(node?.componentType);
8
+ if (!componentType || !HUBSPOT_UI_EXTENSION_TYPES.has(componentType))
9
+ continue;
10
+ const config = asRecord(node?.config);
11
+ const label = asString(config?.name) ??
12
+ asString(config?.label) ??
13
+ (componentType === 'SETTINGS' ? 'Settings' : componentType === 'PAGE' ? 'App Home' : uid);
14
+ const entrypoint = asString(config?.entrypoint);
15
+ const location = asString(config?.location);
16
+ const objectTypes = Array.isArray(config?.objectTypes)
17
+ ? config.objectTypes.filter((item) => typeof item === 'string')
18
+ : [];
19
+ const context = [
20
+ componentType.toLowerCase().replaceAll('_', '-'),
21
+ location,
22
+ objectTypes.length > 0 ? objectTypes.join(', ') : undefined,
23
+ `uid ${uid}`,
24
+ ].filter((item) => Boolean(item));
25
+ candidates.push({
26
+ uid,
27
+ label,
28
+ description: context.join(' · '),
29
+ ...(entrypoint ? { entrypoint } : {}),
30
+ });
31
+ }
32
+ return candidates.toSorted((left, right) => left.label.localeCompare(right.label));
33
+ }
34
+ export function resolveHubSpotDevComponentSelectors(candidates, selectors) {
35
+ if (selectors.length === 0)
36
+ return { ok: true, uids: candidates.map((candidate) => candidate.uid) };
37
+ const uids = [];
38
+ for (const selector of selectors) {
39
+ const candidate = candidates.find((item) => item.uid === selector || item.label === selector || item.entrypoint === selector);
40
+ if (!candidate) {
41
+ return {
42
+ ok: false,
43
+ message: `Unknown HubSpot dev component "${selector}". Available components: ${candidates
44
+ .map((item) => `${item.label} (${item.uid})`)
45
+ .join(', ')}.`,
46
+ };
47
+ }
48
+ if (!uids.includes(candidate.uid))
49
+ uids.push(candidate.uid);
50
+ }
51
+ return { ok: true, uids };
52
+ }
53
+ /**
54
+ * Keep the selected UI extensions plus the app/function nodes the HubSpot UI
55
+ * dev server needs to construct app metadata and serve `runServerlessFunction`
56
+ * calls. Only the selected UI extensions become browser choices.
57
+ */
58
+ export function filterHubSpotDevSessionNodes(nodesByUid, selectedNodeUids) {
59
+ const selected = new Set(selectedNodeUids);
60
+ const activeNodeUids = Object.keys(nodesByUid).filter((uid) => {
61
+ const node = asRecord(nodesByUid[uid]);
62
+ const componentType = asString(node?.componentType);
63
+ return Boolean(componentType && HUBSPOT_UI_EXTENSION_TYPES.has(componentType) && selected.has(uid));
64
+ });
65
+ const filtered = Object.fromEntries(Object.entries(nodesByUid).filter(([uid, value]) => {
66
+ const componentType = asString(asRecord(value)?.componentType);
67
+ return (selected.has(uid) || Boolean(componentType && HUBSPOT_UI_SUPPORT_TYPES.has(componentType)));
68
+ }));
69
+ return { nodesByUid: filtered, activeNodeUids };
70
+ }
71
+ function asRecord(value) {
72
+ return typeof value === 'object' && value !== null
73
+ ? value
74
+ : undefined;
75
+ }
76
+ function asString(value) {
77
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
78
+ }
79
+ //# sourceMappingURL=component-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-selection.js","sourceRoot":"","sources":["../../src/dev/component-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DevLevel } from './event-bus.js';
2
+ declare const CAPTURED_METHODS: readonly ["log", "info", "debug", "warn", "error"];
3
+ type CapturedMethod = (typeof CAPTURED_METHODS)[number];
4
+ type ConsoleLike = Record<CapturedMethod, (...args: unknown[]) => void>;
5
+ export interface CapturedConsoleEntry {
6
+ readonly level: DevLevel;
7
+ readonly message: string;
8
+ readonly method: CapturedMethod;
9
+ }
10
+ /**
11
+ * HubSpot executes local app functions in the CLI process, so their console.*
12
+ * calls otherwise write around the dev renderer and corrupt its pinned filter
13
+ * line. Capture only for the lifetime of the HubSpot dev session and restore
14
+ * every original method byte-for-byte during cleanup.
15
+ */
16
+ export declare function captureConsole(onEntry: (entry: CapturedConsoleEntry) => void, target?: ConsoleLike): () => void;
17
+ export {};
18
+ //# sourceMappingURL=console-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-capture.d.ts","sourceRoot":"","sources":["../../src/dev/console-capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,QAAA,MAAM,gBAAgB,oDAAqD,CAAC;AAE5E,KAAK,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,KAAK,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,EAC9C,MAAM,GAAE,WAA+C,GACtD,MAAM,IAAI,CAoCZ"}
@@ -0,0 +1,57 @@
1
+ import { formatWithOptions } from 'node:util';
2
+ const CAPTURED_METHODS = ['log', 'info', 'debug', 'warn', 'error'];
3
+ /**
4
+ * HubSpot executes local app functions in the CLI process, so their console.*
5
+ * calls otherwise write around the dev renderer and corrupt its pinned filter
6
+ * line. Capture only for the lifetime of the HubSpot dev session and restore
7
+ * every original method byte-for-byte during cleanup.
8
+ */
9
+ export function captureConsole(onEntry, target = console) {
10
+ const originals = new Map();
11
+ let restored = false;
12
+ for (const method of CAPTURED_METHODS) {
13
+ const original = target[method];
14
+ originals.set(method, original);
15
+ target[method] = (...args) => {
16
+ try {
17
+ const message = formatWithOptions({
18
+ colors: false,
19
+ depth: 6,
20
+ breakLength: 120,
21
+ compact: 3,
22
+ maxArrayLength: 100,
23
+ maxStringLength: 65_536,
24
+ }, ...args);
25
+ if (message)
26
+ onEntry({ level: levelFor(method), message, method });
27
+ }
28
+ catch {
29
+ // Logging must never break the app function. Fall back to the original
30
+ // console only if capture itself fails, so the diagnostic is not lost.
31
+ try {
32
+ original.apply(target, args);
33
+ }
34
+ catch {
35
+ // Ignore a broken host console implementation.
36
+ }
37
+ }
38
+ };
39
+ }
40
+ return () => {
41
+ if (restored)
42
+ return;
43
+ restored = true;
44
+ for (const [method, original] of originals)
45
+ target[method] = original;
46
+ };
47
+ }
48
+ function levelFor(method) {
49
+ if (method === 'error')
50
+ return 'error';
51
+ if (method === 'warn')
52
+ return 'warn';
53
+ if (method === 'debug')
54
+ return 'debug';
55
+ return 'info';
56
+ }
57
+ //# sourceMappingURL=console-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-capture.js","sourceRoot":"","sources":["../../src/dev/console-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAW5E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA8C,EAC9C,SAAsB,OAAiC;IAEvD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgD,CAAC;IAC1E,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,iBAAiB,CAC/B;oBACE,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,CAAC;oBACR,WAAW,EAAE,GAAG;oBAChB,OAAO,EAAE,CAAC;oBACV,cAAc,EAAE,GAAG;oBACnB,eAAe,EAAE,MAAM;iBACxB,EACD,GAAG,IAAI,CACR,CAAC;gBACF,IAAI,OAAO;oBAAE,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;gBACvE,uEAAuE;gBACvE,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,+CAA+C;gBACjD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;IACxE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAsB;IACtC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * In-process event bus for `hs-x dev` unified output.
3
3
  *
4
4
  * Four lanes:
5
- * - frontend: logs from card iframe (via @hs-x/sdk-ui `logger` /__hsx/log)
5
+ * - frontend: logs from the card worker (via the local app-function relay)
6
6
  * - backend: stdout/stderr from local handler process (e.g. wrangler dev) — lane wired later
7
7
  * - request: inbound proxied request summaries from local dev-proxy receiver — lane wired later
8
8
  * - hubspot: HubSpot's own app-log entries (card/extension renders, proxy
@@ -2,7 +2,7 @@
2
2
  * In-process event bus for `hs-x dev` unified output.
3
3
  *
4
4
  * Four lanes:
5
- * - frontend: logs from card iframe (via @hs-x/sdk-ui `logger` /__hsx/log)
5
+ * - frontend: logs from the card worker (via the local app-function relay)
6
6
  * - backend: stdout/stderr from local handler process (e.g. wrangler dev) — lane wired later
7
7
  * - request: inbound proxied request summaries from local dev-proxy receiver — lane wired later
8
8
  * - hubspot: HubSpot's own app-log entries (card/extension renders, proxy
@@ -0,0 +1,27 @@
1
+ import type { DevLevel } from './event-bus.js';
2
+ export declare const FRONTEND_LOG_RELAY_UID = "hsx_internal_dev_browser_log_v1";
3
+ export interface FrontendLogEntry {
4
+ readonly level: DevLevel;
5
+ readonly msg: string;
6
+ readonly ts: number;
7
+ readonly source?: string;
8
+ readonly fields?: Record<string, unknown>;
9
+ }
10
+ export interface FrontendLogRelay {
11
+ readonly functionUid: string;
12
+ readonly nodesByUid: Record<string, unknown>;
13
+ readonly modulePath: string;
14
+ cleanup(): Promise<void>;
15
+ }
16
+ /**
17
+ * HubSpot UI extensions execute under `connect-src none`, so browser fetches to
18
+ * localhost are forbidden even though the bundle itself is served locally.
19
+ * Register a temporary app function instead: the worker's native `serverless`
20
+ * channel reaches HubSpot's local dev server, then this in-process hook emits
21
+ * the sanitized entries to HS-X. Nothing is written into the app source tree.
22
+ */
23
+ export declare function createFrontendLogRelay(input: {
24
+ readonly nodesByUid: Readonly<Record<string, unknown>>;
25
+ readonly onEntry: (entry: FrontendLogEntry) => void;
26
+ }): Promise<FrontendLogRelay>;
27
+ //# sourceMappingURL=frontend-log-relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-log-relay.d.ts","sourceRoot":"","sources":["../../src/dev/frontend-log-relay.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAMxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACrD,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqD5B"}
@@ -0,0 +1,102 @@
1
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ export const FRONTEND_LOG_RELAY_UID = 'hsx_internal_dev_browser_log_v1';
5
+ const RELAY_HOOK_KEY = '@hs-x/dev/frontend-log-relay/v1';
6
+ const MAX_BATCH_SIZE = 100;
7
+ const MAX_MESSAGE_LENGTH = 65_536;
8
+ /**
9
+ * HubSpot UI extensions execute under `connect-src none`, so browser fetches to
10
+ * localhost are forbidden even though the bundle itself is served locally.
11
+ * Register a temporary app function instead: the worker's native `serverless`
12
+ * channel reaches HubSpot's local dev server, then this in-process hook emits
13
+ * the sanitized entries to HS-X. Nothing is written into the app source tree.
14
+ */
15
+ export async function createFrontendLogRelay(input) {
16
+ if (FRONTEND_LOG_RELAY_UID in input.nodesByUid) {
17
+ throw new Error(`Reserved HS-X dev function UID is already in use: ${FRONTEND_LOG_RELAY_UID}`);
18
+ }
19
+ const temporaryDir = await mkdtemp(join(tmpdir(), 'hsx-dev-frontend-log-'));
20
+ const modulePath = join(temporaryDir, 'relay.cjs');
21
+ const metaPath = join(temporaryDir, 'relay-hsmeta.json');
22
+ await writeFile(modulePath, `'use strict';\nexports.main = async function main(context) {\n const relay = globalThis[Symbol.for(${JSON.stringify(RELAY_HOOK_KEY)})];\n if (typeof relay === 'function') relay(context && context.parameters);\n return { ok: true };\n};\n`, 'utf8');
23
+ const relaySymbol = Symbol.for(RELAY_HOOK_KEY);
24
+ const relayGlobal = globalThis;
25
+ const previousHook = relayGlobal[relaySymbol];
26
+ relayGlobal[relaySymbol] = (payload) => {
27
+ for (const entry of normalizeRelayPayload(payload))
28
+ input.onEntry(entry);
29
+ };
30
+ const appUid = findApplicationUid(input.nodesByUid);
31
+ const nodesByUid = {
32
+ ...input.nodesByUid,
33
+ [FRONTEND_LOG_RELAY_UID]: {
34
+ uid: FRONTEND_LOG_RELAY_UID,
35
+ componentType: 'APP_FUNCTION',
36
+ componentDeps: appUid ? { app: appUid } : {},
37
+ metaFilePath: 'relay-hsmeta.json',
38
+ config: { entrypoint: 'relay.cjs', secretKeys: [] },
39
+ files: {},
40
+ localDev: {
41
+ componentRoot: temporaryDir,
42
+ componentConfigPath: metaPath,
43
+ },
44
+ },
45
+ };
46
+ let cleanedUp = false;
47
+ return {
48
+ functionUid: FRONTEND_LOG_RELAY_UID,
49
+ nodesByUid,
50
+ modulePath,
51
+ async cleanup() {
52
+ if (cleanedUp)
53
+ return;
54
+ cleanedUp = true;
55
+ if (previousHook === undefined)
56
+ delete relayGlobal[relaySymbol];
57
+ else
58
+ relayGlobal[relaySymbol] = previousHook;
59
+ await rm(temporaryDir, { recursive: true, force: true });
60
+ },
61
+ };
62
+ }
63
+ function normalizeRelayPayload(value) {
64
+ const payload = asRecord(value);
65
+ if (!payload || !Array.isArray(payload.entries))
66
+ return [];
67
+ const entries = [];
68
+ for (const candidate of payload.entries.slice(0, MAX_BATCH_SIZE)) {
69
+ const entry = asRecord(candidate);
70
+ const msg = typeof entry?.msg === 'string' ? entry.msg.slice(0, MAX_MESSAGE_LENGTH) : '';
71
+ if (!msg)
72
+ continue;
73
+ const level = isDevLevel(entry?.level) ? entry.level : 'info';
74
+ const fields = asRecord(entry?.fields);
75
+ entries.push({
76
+ level,
77
+ msg,
78
+ ts: typeof entry?.ts === 'number' && Number.isFinite(entry.ts) ? entry.ts : Date.now(),
79
+ ...(typeof entry?.source === 'string' && entry.source
80
+ ? { source: entry.source.slice(0, 256) }
81
+ : {}),
82
+ ...(fields ? { fields } : {}),
83
+ });
84
+ }
85
+ return entries;
86
+ }
87
+ function findApplicationUid(nodesByUid) {
88
+ for (const [uid, value] of Object.entries(nodesByUid)) {
89
+ if (asRecord(value)?.componentType === 'APPLICATION')
90
+ return uid;
91
+ }
92
+ return undefined;
93
+ }
94
+ function isDevLevel(value) {
95
+ return value === 'debug' || value === 'info' || value === 'warn' || value === 'error';
96
+ }
97
+ function asRecord(value) {
98
+ return typeof value === 'object' && value !== null
99
+ ? value
100
+ : undefined;
101
+ }
102
+ //# sourceMappingURL=frontend-log-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-log-relay.js","sourceRoot":"","sources":["../../src/dev/frontend-log-relay.ts"],"names":[],"mappings":"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"}