@hubspot/app-connect-sdk 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (731) hide show
  1. package/.turbo/turbo-format$colon$check.log +1 -1
  2. package/.turbo/turbo-test.log +101 -57
  3. package/.turbo/turbo-tsdown.log +474 -469
  4. package/build/tsconfig.browser.tsbuildinfo +1 -1
  5. package/build/tsconfig.server.tsbuildinfo +1 -1
  6. package/dist/browser/{HubSpotAppConnect-BW45gyDs.js → HubSpotAppConnect-721kYr9d.js} +17 -23
  7. package/dist/browser/HubSpotAppConnect-721kYr9d.js.map +1 -0
  8. package/dist/browser/{create-vctOhpX9.js → create-DxEyGG-k.js} +336 -100
  9. package/dist/browser/create-DxEyGG-k.js.map +1 -0
  10. package/dist/browser/index.d.ts +2 -2
  11. package/dist/browser/index.js +1 -1
  12. package/dist/browser/react/lovable.d.ts +9 -2
  13. package/dist/browser/react/lovable.js +7 -4
  14. package/dist/browser/react/lovable.js.map +1 -1
  15. package/dist/browser/react.d.ts +2 -3
  16. package/dist/browser/react.js +1 -1
  17. package/dist/browser/{types-rTQw6A54.d.ts → types-C3wed8dU.d.ts} +52 -7
  18. package/dist/server/api-client-core/apis/account/account-info-types.generated.d.ts +73 -85
  19. package/dist/server/api-client-core/apis/account/account-info.generated.d.ts +3 -3
  20. package/dist/server/api-client-core/apis/account/account-info.generated.js +4 -3
  21. package/dist/server/api-client-core/apis/account/account-info.generated.js.map +1 -1
  22. package/dist/server/api-client-core/apis/account/audit-logs-types.generated.d.ts +203 -215
  23. package/dist/server/api-client-core/apis/account/audit-logs.generated.d.ts +3 -3
  24. package/dist/server/api-client-core/apis/account/audit-logs.generated.js +4 -3
  25. package/dist/server/api-client-core/apis/account/audit-logs.generated.js.map +1 -1
  26. package/dist/server/api-client-core/apis/auth/oauth-types.generated.d.ts +78 -90
  27. package/dist/server/api-client-core/apis/auth/oauth.generated.d.ts +1 -1
  28. package/dist/server/api-client-core/apis/auth/oauth.generated.js +3 -2
  29. package/dist/server/api-client-core/apis/auth/oauth.generated.js.map +1 -1
  30. package/dist/server/api-client-core/apis/automation/actions-types.generated.d.ts +779 -794
  31. package/dist/server/api-client-core/apis/automation/actions.generated.d.ts +6 -3
  32. package/dist/server/api-client-core/apis/automation/actions.generated.js +101 -102
  33. package/dist/server/api-client-core/apis/automation/actions.generated.js.map +1 -1
  34. package/dist/server/api-client-core/apis/automation/sequences-types.generated.d.ts +370 -382
  35. package/dist/server/api-client-core/apis/automation/sequences.generated.d.ts +1 -1
  36. package/dist/server/api-client-core/apis/automation/sequences.generated.js +3 -2
  37. package/dist/server/api-client-core/apis/automation/sequences.generated.js.map +1 -1
  38. package/dist/server/api-client-core/apis/business-units-types.generated.d.ts +43 -55
  39. package/dist/server/api-client-core/apis/business-units.generated.d.ts +3 -3
  40. package/dist/server/api-client-core/apis/business-units.generated.js +4 -3
  41. package/dist/server/api-client-core/apis/business-units.generated.js.map +1 -1
  42. package/dist/server/api-client-core/apis/cms/authors-types.generated.d.ts +420 -445
  43. package/dist/server/api-client-core/apis/cms/authors.generated.d.ts +4 -3
  44. package/dist/server/api-client-core/apis/cms/authors.generated.js +155 -158
  45. package/dist/server/api-client-core/apis/cms/authors.generated.js.map +1 -1
  46. package/dist/server/api-client-core/apis/cms/blog-settings-types.generated.d.ts +270 -295
  47. package/dist/server/api-client-core/apis/cms/blog-settings.generated.d.ts +4 -3
  48. package/dist/server/api-client-core/apis/cms/blog-settings.generated.js +35 -38
  49. package/dist/server/api-client-core/apis/cms/blog-settings.generated.js.map +1 -1
  50. package/dist/server/api-client-core/apis/cms/cms-content-audit-types.generated.d.ts +107 -131
  51. package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.d.ts +3 -3
  52. package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js +6 -5
  53. package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js.map +1 -1
  54. package/dist/server/api-client-core/apis/cms/domains-types.generated.d.ts +155 -167
  55. package/dist/server/api-client-core/apis/cms/domains.generated.d.ts +2 -2
  56. package/dist/server/api-client-core/apis/cms/domains.generated.js +3 -2
  57. package/dist/server/api-client-core/apis/cms/domains.generated.js.map +1 -1
  58. package/dist/server/api-client-core/apis/cms/hubdb-types.generated.d.ts +876 -889
  59. package/dist/server/api-client-core/apis/cms/hubdb.generated.d.ts +4 -3
  60. package/dist/server/api-client-core/apis/cms/hubdb.generated.js +184 -185
  61. package/dist/server/api-client-core/apis/cms/hubdb.generated.js.map +1 -1
  62. package/dist/server/api-client-core/apis/cms/media-bridge-types.generated.d.ts +1550 -1575
  63. package/dist/server/api-client-core/apis/cms/media-bridge.generated.d.ts +4 -3
  64. package/dist/server/api-client-core/apis/cms/media-bridge.generated.js +161 -164
  65. package/dist/server/api-client-core/apis/cms/media-bridge.generated.js.map +1 -1
  66. package/dist/server/api-client-core/apis/cms/pages-types.generated.d.ts +1583 -1547
  67. package/dist/server/api-client-core/apis/cms/pages.generated.d.ts +15 -3
  68. package/dist/server/api-client-core/apis/cms/pages.generated.js +335 -326
  69. package/dist/server/api-client-core/apis/cms/pages.generated.js.map +1 -1
  70. package/dist/server/api-client-core/apis/cms/posts-types.generated.d.ts +900 -904
  71. package/dist/server/api-client-core/apis/cms/posts.generated.d.ts +7 -3
  72. package/dist/server/api-client-core/apis/cms/posts.generated.js +197 -196
  73. package/dist/server/api-client-core/apis/cms/posts.generated.js.map +1 -1
  74. package/dist/server/api-client-core/apis/cms/site-search-types.generated.d.ts +162 -174
  75. package/dist/server/api-client-core/apis/cms/site-search.generated.d.ts +3 -3
  76. package/dist/server/api-client-core/apis/cms/site-search.generated.js +4 -3
  77. package/dist/server/api-client-core/apis/cms/site-search.generated.js.map +1 -1
  78. package/dist/server/api-client-core/apis/cms/source-code-types.generated.d.ts +148 -172
  79. package/dist/server/api-client-core/apis/cms/source-code.generated.d.ts +3 -3
  80. package/dist/server/api-client-core/apis/cms/source-code.generated.js +40 -43
  81. package/dist/server/api-client-core/apis/cms/source-code.generated.js.map +1 -1
  82. package/dist/server/api-client-core/apis/cms/tags-types.generated.d.ts +406 -420
  83. package/dist/server/api-client-core/apis/cms/tags.generated.d.ts +5 -3
  84. package/dist/server/api-client-core/apis/cms/tags.generated.js +157 -158
  85. package/dist/server/api-client-core/apis/cms/tags.generated.js.map +1 -1
  86. package/dist/server/api-client-core/apis/cms/url-mappings-types.generated.d.ts +127 -139
  87. package/dist/server/api-client-core/apis/cms/url-mappings.generated.d.ts +3 -3
  88. package/dist/server/api-client-core/apis/cms/url-mappings.generated.js +4 -3
  89. package/dist/server/api-client-core/apis/cms/url-mappings.generated.js.map +1 -1
  90. package/dist/server/api-client-core/apis/cms/url-redirects-types.generated.d.ts +170 -182
  91. package/dist/server/api-client-core/apis/cms/url-redirects.generated.d.ts +3 -3
  92. package/dist/server/api-client-core/apis/cms/url-redirects.generated.js +4 -3
  93. package/dist/server/api-client-core/apis/cms/url-redirects.generated.js.map +1 -1
  94. package/dist/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.d.ts +728 -742
  95. package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.d.ts +5 -3
  96. package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js +66 -69
  97. package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js.map +1 -1
  98. package/dist/server/api-client-core/apis/conversations/custom-channels-types.generated.d.ts +445 -471
  99. package/dist/server/api-client-core/apis/conversations/custom-channels.generated.d.ts +5 -3
  100. package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js +70 -73
  101. package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js.map +1 -1
  102. package/dist/server/api-client-core/apis/conversations/visitor-identification-types.generated.d.ts +28 -40
  103. package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.d.ts +3 -3
  104. package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js +3 -2
  105. package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js.map +1 -1
  106. package/dist/server/api-client-core/apis/conversations-types.generated.d.ts +768 -781
  107. package/dist/server/api-client-core/apis/conversations.generated.d.ts +4 -3
  108. package/dist/server/api-client-core/apis/conversations.generated.js +101 -102
  109. package/dist/server/api-client-core/apis/conversations.generated.js.map +1 -1
  110. package/dist/server/api-client-core/apis/crm/app-uninstalls-types.generated.d.ts +8 -19
  111. package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.d.ts +3 -3
  112. package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js +3 -2
  113. package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js.map +1 -1
  114. package/dist/server/api-client-core/apis/crm/appointments-types.generated.d.ts +887 -891
  115. package/dist/server/api-client-core/apis/crm/appointments.generated.d.ts +7 -3
  116. package/dist/server/api-client-core/apis/crm/appointments.generated.js +105 -106
  117. package/dist/server/api-client-core/apis/crm/appointments.generated.js.map +1 -1
  118. package/dist/server/api-client-core/apis/crm/associations-schema-types.generated.d.ts +247 -260
  119. package/dist/server/api-client-core/apis/crm/associations-schema.generated.d.ts +4 -3
  120. package/dist/server/api-client-core/apis/crm/associations-schema.generated.js +48 -49
  121. package/dist/server/api-client-core/apis/crm/associations-schema.generated.js.map +1 -1
  122. package/dist/server/api-client-core/apis/crm/associations-types.generated.d.ts +576 -590
  123. package/dist/server/api-client-core/apis/crm/associations.generated.d.ts +5 -3
  124. package/dist/server/api-client-core/apis/crm/associations.generated.js +71 -72
  125. package/dist/server/api-client-core/apis/crm/associations.generated.js.map +1 -1
  126. package/dist/server/api-client-core/apis/crm/calling-extensions-types.generated.d.ts +355 -379
  127. package/dist/server/api-client-core/apis/crm/calling-extensions.generated.d.ts +3 -3
  128. package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js +34 -37
  129. package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js.map +1 -1
  130. package/dist/server/api-client-core/apis/crm/calls-types.generated.d.ts +755 -769
  131. package/dist/server/api-client-core/apis/crm/calls.generated.d.ts +5 -3
  132. package/dist/server/api-client-core/apis/crm/calls.generated.js +58 -57
  133. package/dist/server/api-client-core/apis/crm/calls.generated.js.map +1 -1
  134. package/dist/server/api-client-core/apis/crm/carts-types.generated.d.ts +755 -769
  135. package/dist/server/api-client-core/apis/crm/carts.generated.d.ts +5 -3
  136. package/dist/server/api-client-core/apis/crm/carts.generated.js +58 -57
  137. package/dist/server/api-client-core/apis/crm/carts.generated.js.map +1 -1
  138. package/dist/server/api-client-core/apis/crm/commerce-payments-types.generated.d.ts +755 -769
  139. package/dist/server/api-client-core/apis/crm/commerce-payments.generated.d.ts +5 -3
  140. package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js +58 -57
  141. package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js.map +1 -1
  142. package/dist/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.d.ts +752 -766
  143. package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.d.ts +5 -3
  144. package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js +58 -57
  145. package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js.map +1 -1
  146. package/dist/server/api-client-core/apis/crm/communications-types.generated.d.ts +755 -769
  147. package/dist/server/api-client-core/apis/crm/communications.generated.d.ts +5 -3
  148. package/dist/server/api-client-core/apis/crm/communications.generated.js +58 -57
  149. package/dist/server/api-client-core/apis/crm/communications.generated.js.map +1 -1
  150. package/dist/server/api-client-core/apis/crm/companies-types.generated.d.ts +769 -795
  151. package/dist/server/api-client-core/apis/crm/companies.generated.d.ts +5 -3
  152. package/dist/server/api-client-core/apis/crm/companies.generated.js +59 -58
  153. package/dist/server/api-client-core/apis/crm/companies.generated.js.map +1 -1
  154. package/dist/server/api-client-core/apis/crm/contacts-types.generated.d.ts +786 -812
  155. package/dist/server/api-client-core/apis/crm/contacts.generated.d.ts +5 -3
  156. package/dist/server/api-client-core/apis/crm/contacts.generated.js +60 -61
  157. package/dist/server/api-client-core/apis/crm/contacts.generated.js.map +1 -1
  158. package/dist/server/api-client-core/apis/crm/contracts-types.generated.d.ts +796 -777
  159. package/dist/server/api-client-core/apis/crm/contracts.generated.d.ts +8 -3
  160. package/dist/server/api-client-core/apis/crm/contracts.generated.js +60 -57
  161. package/dist/server/api-client-core/apis/crm/contracts.generated.js.map +1 -1
  162. package/dist/server/api-client-core/apis/crm/courses-types.generated.d.ts +758 -772
  163. package/dist/server/api-client-core/apis/crm/courses.generated.d.ts +5 -3
  164. package/dist/server/api-client-core/apis/crm/courses.generated.js +58 -57
  165. package/dist/server/api-client-core/apis/crm/courses.generated.js.map +1 -1
  166. package/dist/server/api-client-core/apis/crm/crm-owners-types.generated.d.ts +103 -115
  167. package/dist/server/api-client-core/apis/crm/crm-owners.generated.d.ts +3 -3
  168. package/dist/server/api-client-core/apis/crm/crm-owners.generated.js +4 -3
  169. package/dist/server/api-client-core/apis/crm/crm-owners.generated.js.map +1 -1
  170. package/dist/server/api-client-core/apis/crm/custom-objects-types.generated.d.ts +833 -848
  171. package/dist/server/api-client-core/apis/crm/custom-objects.generated.d.ts +6 -3
  172. package/dist/server/api-client-core/apis/crm/custom-objects.generated.js +91 -90
  173. package/dist/server/api-client-core/apis/crm/custom-objects.generated.js.map +1 -1
  174. package/dist/server/api-client-core/apis/crm/deal-splits-types.generated.d.ts +158 -170
  175. package/dist/server/api-client-core/apis/crm/deal-splits.generated.d.ts +3 -3
  176. package/dist/server/api-client-core/apis/crm/deal-splits.generated.js +4 -3
  177. package/dist/server/api-client-core/apis/crm/deal-splits.generated.js.map +1 -1
  178. package/dist/server/api-client-core/apis/crm/deals-types.generated.d.ts +771 -785
  179. package/dist/server/api-client-core/apis/crm/deals.generated.d.ts +5 -3
  180. package/dist/server/api-client-core/apis/crm/deals.generated.js +59 -58
  181. package/dist/server/api-client-core/apis/crm/deals.generated.js.map +1 -1
  182. package/dist/server/api-client-core/apis/crm/discounts-types.generated.d.ts +754 -768
  183. package/dist/server/api-client-core/apis/crm/discounts.generated.d.ts +5 -3
  184. package/dist/server/api-client-core/apis/crm/discounts.generated.js +58 -57
  185. package/dist/server/api-client-core/apis/crm/discounts.generated.js.map +1 -1
  186. package/dist/server/api-client-core/apis/crm/emails-types.generated.d.ts +755 -769
  187. package/dist/server/api-client-core/apis/crm/emails.generated.d.ts +5 -3
  188. package/dist/server/api-client-core/apis/crm/emails.generated.js +58 -57
  189. package/dist/server/api-client-core/apis/crm/emails.generated.js.map +1 -1
  190. package/dist/server/api-client-core/apis/crm/exports-types.generated.d.ts +227 -251
  191. package/dist/server/api-client-core/apis/crm/exports.generated.d.ts +2 -2
  192. package/dist/server/api-client-core/apis/crm/exports.generated.js +4 -5
  193. package/dist/server/api-client-core/apis/crm/exports.generated.js.map +1 -1
  194. package/dist/server/api-client-core/apis/crm/feedback-submissions-types.generated.d.ts +551 -565
  195. package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.d.ts +5 -3
  196. package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js +45 -46
  197. package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js.map +1 -1
  198. package/dist/server/api-client-core/apis/crm/fees-types.generated.d.ts +755 -769
  199. package/dist/server/api-client-core/apis/crm/fees.generated.d.ts +5 -3
  200. package/dist/server/api-client-core/apis/crm/fees.generated.js +58 -57
  201. package/dist/server/api-client-core/apis/crm/fees.generated.js.map +1 -1
  202. package/dist/server/api-client-core/apis/crm/goal-targets-types.generated.d.ts +755 -769
  203. package/dist/server/api-client-core/apis/crm/goal-targets.generated.d.ts +5 -3
  204. package/dist/server/api-client-core/apis/crm/goal-targets.generated.js +58 -57
  205. package/dist/server/api-client-core/apis/crm/goal-targets.generated.js.map +1 -1
  206. package/dist/server/api-client-core/apis/crm/imports-types.generated.d.ts +305 -329
  207. package/dist/server/api-client-core/apis/crm/imports.generated.d.ts +2 -2
  208. package/dist/server/api-client-core/apis/crm/imports.generated.js +20 -23
  209. package/dist/server/api-client-core/apis/crm/imports.generated.js.map +1 -1
  210. package/dist/server/api-client-core/apis/crm/invoices-types.generated.d.ts +755 -769
  211. package/dist/server/api-client-core/apis/crm/invoices.generated.d.ts +5 -3
  212. package/dist/server/api-client-core/apis/crm/invoices.generated.js +58 -57
  213. package/dist/server/api-client-core/apis/crm/invoices.generated.js.map +1 -1
  214. package/dist/server/api-client-core/apis/crm/leads-types.generated.d.ts +755 -769
  215. package/dist/server/api-client-core/apis/crm/leads.generated.d.ts +5 -3
  216. package/dist/server/api-client-core/apis/crm/leads.generated.js +58 -57
  217. package/dist/server/api-client-core/apis/crm/leads.generated.js.map +1 -1
  218. package/dist/server/api-client-core/apis/crm/limits-tracking-types.generated.d.ts +251 -263
  219. package/dist/server/api-client-core/apis/crm/limits-tracking.generated.d.ts +3 -3
  220. package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js +4 -3
  221. package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js.map +1 -1
  222. package/dist/server/api-client-core/apis/crm/line-items-types.generated.d.ts +755 -769
  223. package/dist/server/api-client-core/apis/crm/line-items.generated.d.ts +5 -3
  224. package/dist/server/api-client-core/apis/crm/line-items.generated.js +58 -57
  225. package/dist/server/api-client-core/apis/crm/line-items.generated.js.map +1 -1
  226. package/dist/server/api-client-core/apis/crm/listings-types.generated.d.ts +758 -772
  227. package/dist/server/api-client-core/apis/crm/listings.generated.d.ts +5 -3
  228. package/dist/server/api-client-core/apis/crm/listings.generated.js +58 -57
  229. package/dist/server/api-client-core/apis/crm/listings.generated.js.map +1 -1
  230. package/dist/server/api-client-core/apis/crm/lists-types.generated.d.ts +2075 -2111
  231. package/dist/server/api-client-core/apis/crm/lists.generated.d.ts +2 -2
  232. package/dist/server/api-client-core/apis/crm/lists.generated.js +97 -98
  233. package/dist/server/api-client-core/apis/crm/lists.generated.js.map +1 -1
  234. package/dist/server/api-client-core/apis/crm/meetings-types.generated.d.ts +755 -769
  235. package/dist/server/api-client-core/apis/crm/meetings.generated.d.ts +5 -3
  236. package/dist/server/api-client-core/apis/crm/meetings.generated.js +58 -57
  237. package/dist/server/api-client-core/apis/crm/meetings.generated.js.map +1 -1
  238. package/dist/server/api-client-core/apis/crm/notes-types.generated.d.ts +755 -769
  239. package/dist/server/api-client-core/apis/crm/notes.generated.d.ts +5 -3
  240. package/dist/server/api-client-core/apis/crm/notes.generated.js +58 -57
  241. package/dist/server/api-client-core/apis/crm/notes.generated.js.map +1 -1
  242. package/dist/server/api-client-core/apis/crm/object-library-types.generated.d.ts +24 -36
  243. package/dist/server/api-client-core/apis/crm/object-library.generated.d.ts +3 -3
  244. package/dist/server/api-client-core/apis/crm/object-library.generated.js +4 -3
  245. package/dist/server/api-client-core/apis/crm/object-library.generated.js.map +1 -1
  246. package/dist/server/api-client-core/apis/crm/objects-types.generated.d.ts +620 -645
  247. package/dist/server/api-client-core/apis/crm/objects.generated.d.ts +4 -3
  248. package/dist/server/api-client-core/apis/crm/objects.generated.js +66 -67
  249. package/dist/server/api-client-core/apis/crm/objects.generated.js.map +1 -1
  250. package/dist/server/api-client-core/apis/crm/orders-types.generated.d.ts +747 -761
  251. package/dist/server/api-client-core/apis/crm/orders.generated.d.ts +5 -3
  252. package/dist/server/api-client-core/apis/crm/orders.generated.js +58 -57
  253. package/dist/server/api-client-core/apis/crm/orders.generated.js.map +1 -1
  254. package/dist/server/api-client-core/apis/crm/partner-clients-types.generated.d.ts +646 -660
  255. package/dist/server/api-client-core/apis/crm/partner-clients.generated.d.ts +5 -3
  256. package/dist/server/api-client-core/apis/crm/partner-clients.generated.js +63 -62
  257. package/dist/server/api-client-core/apis/crm/partner-clients.generated.js.map +1 -1
  258. package/dist/server/api-client-core/apis/crm/partner-services-types.generated.d.ts +646 -660
  259. package/dist/server/api-client-core/apis/crm/partner-services.generated.d.ts +5 -3
  260. package/dist/server/api-client-core/apis/crm/partner-services.generated.js +63 -62
  261. package/dist/server/api-client-core/apis/crm/partner-services.generated.js.map +1 -1
  262. package/dist/server/api-client-core/apis/crm/pipelines-types.generated.d.ts +320 -332
  263. package/dist/server/api-client-core/apis/crm/pipelines.generated.d.ts +2 -2
  264. package/dist/server/api-client-core/apis/crm/pipelines.generated.js +3 -2
  265. package/dist/server/api-client-core/apis/crm/pipelines.generated.js.map +1 -1
  266. package/dist/server/api-client-core/apis/crm/postal-mail-types.generated.d.ts +744 -758
  267. package/dist/server/api-client-core/apis/crm/postal-mail.generated.d.ts +5 -3
  268. package/dist/server/api-client-core/apis/crm/postal-mail.generated.js +58 -57
  269. package/dist/server/api-client-core/apis/crm/postal-mail.generated.js.map +1 -1
  270. package/dist/server/api-client-core/apis/crm/products-types.generated.d.ts +747 -761
  271. package/dist/server/api-client-core/apis/crm/products.generated.d.ts +5 -3
  272. package/dist/server/api-client-core/apis/crm/products.generated.js +58 -57
  273. package/dist/server/api-client-core/apis/crm/products.generated.js.map +1 -1
  274. package/dist/server/api-client-core/apis/crm/projects-types.generated.d.ts +761 -787
  275. package/dist/server/api-client-core/apis/crm/projects.generated.d.ts +5 -3
  276. package/dist/server/api-client-core/apis/crm/projects.generated.js +59 -58
  277. package/dist/server/api-client-core/apis/crm/projects.generated.js.map +1 -1
  278. package/dist/server/api-client-core/apis/crm/properties-types.generated.d.ts +526 -528
  279. package/dist/server/api-client-core/apis/crm/properties.generated.d.ts +5 -3
  280. package/dist/server/api-client-core/apis/crm/properties.generated.js +79 -78
  281. package/dist/server/api-client-core/apis/crm/properties.generated.js.map +1 -1
  282. package/dist/server/api-client-core/apis/crm/property-validations-types.generated.d.ts +71 -83
  283. package/dist/server/api-client-core/apis/crm/property-validations.generated.d.ts +3 -3
  284. package/dist/server/api-client-core/apis/crm/property-validations.generated.js +4 -3
  285. package/dist/server/api-client-core/apis/crm/property-validations.generated.js.map +1 -1
  286. package/dist/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.d.ts +409 -433
  287. package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.d.ts +3 -3
  288. package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js +24 -25
  289. package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js.map +1 -1
  290. package/dist/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.d.ts +156 -169
  291. package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.d.ts +4 -3
  292. package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js +55 -56
  293. package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js.map +1 -1
  294. package/dist/server/api-client-core/apis/crm/quotes-types.generated.d.ts +747 -761
  295. package/dist/server/api-client-core/apis/crm/quotes.generated.d.ts +5 -3
  296. package/dist/server/api-client-core/apis/crm/quotes.generated.js +58 -57
  297. package/dist/server/api-client-core/apis/crm/quotes.generated.js.map +1 -1
  298. package/dist/server/api-client-core/apis/crm/schemas-types.generated.d.ts +575 -600
  299. package/dist/server/api-client-core/apis/crm/schemas.generated.d.ts +4 -3
  300. package/dist/server/api-client-core/apis/crm/schemas.generated.js +33 -34
  301. package/dist/server/api-client-core/apis/crm/schemas.generated.js.map +1 -1
  302. package/dist/server/api-client-core/apis/crm/services-types.generated.d.ts +750 -764
  303. package/dist/server/api-client-core/apis/crm/services.generated.d.ts +5 -3
  304. package/dist/server/api-client-core/apis/crm/services.generated.js +58 -57
  305. package/dist/server/api-client-core/apis/crm/services.generated.js.map +1 -1
  306. package/dist/server/api-client-core/apis/crm/tasks-types.generated.d.ts +747 -761
  307. package/dist/server/api-client-core/apis/crm/tasks.generated.d.ts +5 -3
  308. package/dist/server/api-client-core/apis/crm/tasks.generated.js +58 -57
  309. package/dist/server/api-client-core/apis/crm/tasks.generated.js.map +1 -1
  310. package/dist/server/api-client-core/apis/crm/taxes-types.generated.d.ts +747 -761
  311. package/dist/server/api-client-core/apis/crm/taxes.generated.d.ts +5 -3
  312. package/dist/server/api-client-core/apis/crm/taxes.generated.js +58 -57
  313. package/dist/server/api-client-core/apis/crm/taxes.generated.js.map +1 -1
  314. package/dist/server/api-client-core/apis/crm/tickets-types.generated.d.ts +764 -790
  315. package/dist/server/api-client-core/apis/crm/tickets.generated.d.ts +5 -3
  316. package/dist/server/api-client-core/apis/crm/tickets.generated.js +59 -58
  317. package/dist/server/api-client-core/apis/crm/tickets.generated.js.map +1 -1
  318. package/dist/server/api-client-core/apis/crm/timeline-types.generated.d.ts +136 -149
  319. package/dist/server/api-client-core/apis/crm/timeline.generated.d.ts +4 -3
  320. package/dist/server/api-client-core/apis/crm/timeline.generated.js +5 -6
  321. package/dist/server/api-client-core/apis/crm/timeline.generated.js.map +1 -1
  322. package/dist/server/api-client-core/apis/crm/transcriptions-types.generated.d.ts +104 -117
  323. package/dist/server/api-client-core/apis/crm/transcriptions.generated.d.ts +4 -3
  324. package/dist/server/api-client-core/apis/crm/transcriptions.generated.js +7 -10
  325. package/dist/server/api-client-core/apis/crm/transcriptions.generated.js.map +1 -1
  326. package/dist/server/api-client-core/apis/crm/users-types.generated.d.ts +747 -761
  327. package/dist/server/api-client-core/apis/crm/users.generated.d.ts +5 -3
  328. package/dist/server/api-client-core/apis/crm/users.generated.js +58 -57
  329. package/dist/server/api-client-core/apis/crm/users.generated.js.map +1 -1
  330. package/dist/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.d.ts +28 -40
  331. package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.d.ts +3 -3
  332. package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js +4 -3
  333. package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js.map +1 -1
  334. package/dist/server/api-client-core/apis/events/manage-event-definitions-types.generated.d.ts +909 -945
  335. package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.d.ts +3 -3
  336. package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js +29 -30
  337. package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js.map +1 -1
  338. package/dist/server/api-client-core/apis/events/send-event-completions-types.generated.d.ts +49 -62
  339. package/dist/server/api-client-core/apis/events/send-event-completions.generated.d.ts +4 -3
  340. package/dist/server/api-client-core/apis/events/send-event-completions.generated.js +4 -5
  341. package/dist/server/api-client-core/apis/events/send-event-completions.generated.js.map +1 -1
  342. package/dist/server/api-client-core/apis/events-types.generated.d.ts +99 -111
  343. package/dist/server/api-client-core/apis/events.generated.d.ts +3 -3
  344. package/dist/server/api-client-core/apis/events.generated.js +4 -3
  345. package/dist/server/api-client-core/apis/events.generated.js.map +1 -1
  346. package/dist/server/api-client-core/apis/files-types.generated.d.ts +636 -649
  347. package/dist/server/api-client-core/apis/files.generated.d.ts +4 -3
  348. package/dist/server/api-client-core/apis/files.generated.js +112 -113
  349. package/dist/server/api-client-core/apis/files.generated.js.map +1 -1
  350. package/dist/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.d.ts +799 -816
  351. package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.d.ts +8 -3
  352. package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js +126 -127
  353. package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js.map +1 -1
  354. package/dist/server/api-client-core/apis/marketing/marketing-emails-types.generated.d.ts +745 -769
  355. package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.d.ts +3 -3
  356. package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js +100 -103
  357. package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js.map +1 -1
  358. package/dist/server/api-client-core/apis/marketing/marketing-events-types.generated.d.ts +1504 -1546
  359. package/dist/server/api-client-core/apis/marketing/marketing-events.generated.d.ts +9 -3
  360. package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js +162 -167
  361. package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js.map +1 -1
  362. package/dist/server/api-client-core/apis/marketing/single-send-types.generated.d.ts +91 -103
  363. package/dist/server/api-client-core/apis/marketing/single-send.generated.d.ts +3 -3
  364. package/dist/server/api-client-core/apis/marketing/single-send.generated.js +3 -2
  365. package/dist/server/api-client-core/apis/marketing/single-send.generated.js.map +1 -1
  366. package/dist/server/api-client-core/apis/marketing/transactional-single-send-types.generated.d.ts +187 -200
  367. package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.d.ts +4 -3
  368. package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js +14 -15
  369. package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js.map +1 -1
  370. package/dist/server/api-client-core/apis/meta/origins-types.generated.d.ts +41 -53
  371. package/dist/server/api-client-core/apis/meta/origins.generated.d.ts +3 -3
  372. package/dist/server/api-client-core/apis/meta/origins.generated.js +4 -3
  373. package/dist/server/api-client-core/apis/meta/origins.generated.js.map +1 -1
  374. package/dist/server/api-client-core/apis/scheduler/meetings-types.generated.d.ts +850 -863
  375. package/dist/server/api-client-core/apis/scheduler/meetings.generated.d.ts +4 -3
  376. package/dist/server/api-client-core/apis/scheduler/meetings.generated.js +28 -29
  377. package/dist/server/api-client-core/apis/scheduler/meetings.generated.js.map +1 -1
  378. package/dist/server/api-client-core/apis/settings/multicurrency-types.generated.d.ts +281 -296
  379. package/dist/server/api-client-core/apis/settings/multicurrency.generated.d.ts +6 -3
  380. package/dist/server/api-client-core/apis/settings/multicurrency.generated.js +32 -33
  381. package/dist/server/api-client-core/apis/settings/multicurrency.generated.js.map +1 -1
  382. package/dist/server/api-client-core/apis/settings/tax-rates-types.generated.d.ts +71 -83
  383. package/dist/server/api-client-core/apis/settings/tax-rates.generated.d.ts +3 -3
  384. package/dist/server/api-client-core/apis/settings/tax-rates.generated.js +4 -3
  385. package/dist/server/api-client-core/apis/settings/tax-rates.generated.js.map +1 -1
  386. package/dist/server/api-client-core/apis/settings/user-provisioning-types.generated.d.ts +202 -250
  387. package/dist/server/api-client-core/apis/settings/user-provisioning.generated.d.ts +3 -3
  388. package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js +23 -26
  389. package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js.map +1 -1
  390. package/dist/server/api-client-core/apis/webhooks-journal-types.generated.d.ts +490 -526
  391. package/dist/server/api-client-core/apis/webhooks-journal.generated.d.ts +3 -3
  392. package/dist/server/api-client-core/apis/webhooks-journal.generated.js +65 -70
  393. package/dist/server/api-client-core/apis/webhooks-journal.generated.js.map +1 -1
  394. package/dist/server/api-client-core/apis/webhooks-types.generated.d.ts +816 -852
  395. package/dist/server/api-client-core/apis/webhooks.generated.d.ts +3 -3
  396. package/dist/server/api-client-core/apis/webhooks.generated.js +93 -98
  397. package/dist/server/api-client-core/apis/webhooks.generated.js.map +1 -1
  398. package/dist/server/api-client-core/binary-data.js.map +1 -1
  399. package/dist/server/api-client-core/client.js +5 -1
  400. package/dist/server/api-client-core/client.js.map +1 -1
  401. package/dist/server/api-client-core/codegen-helpers/file-op-wrappers.js.map +1 -1
  402. package/dist/server/api-client-core/errors.js.map +1 -1
  403. package/dist/server/api-client-core/op.js.map +1 -1
  404. package/dist/server/api-client-core/pagination.d.ts +2 -2
  405. package/dist/server/api-client-core/pagination.js +2 -2
  406. package/dist/server/api-client-core/pagination.js.map +1 -1
  407. package/dist/server/api-client-core/plugins/fetch-transport.js +33 -9
  408. package/dist/server/api-client-core/plugins/fetch-transport.js.map +1 -1
  409. package/dist/server/api-client-core/types.d.ts +1 -1
  410. package/dist/server/api-client.d.ts +184 -184
  411. package/dist/server/api-client.js +89 -89
  412. package/dist/server/constants.js +33 -6
  413. package/dist/server/constants.js.map +1 -1
  414. package/dist/server/deno/start.js.map +1 -1
  415. package/dist/server/hono/hono-request-handler.js +32 -23
  416. package/dist/server/hono/hono-request-handler.js.map +1 -1
  417. package/dist/server/hono/hubspot-connect-routes/auth-complete.js +158 -0
  418. package/dist/server/hono/hubspot-connect-routes/auth-complete.js.map +1 -0
  419. package/dist/server/hono/hubspot-connect-routes/auth-init-session.js +25 -12
  420. package/dist/server/hono/hubspot-connect-routes/auth-init-session.js.map +1 -1
  421. package/dist/server/hono/hubspot-connect-routes/auth-logout.js +32 -9
  422. package/dist/server/hono/hubspot-connect-routes/auth-logout.js.map +1 -1
  423. package/dist/server/hono/hubspot-connect-routes/auth-refresh.js +32 -18
  424. package/dist/server/hono/hubspot-connect-routes/auth-refresh.js.map +1 -1
  425. package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.js.map +1 -1
  426. package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js +4 -1
  427. package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js.map +1 -1
  428. package/dist/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.js.map +1 -1
  429. package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js +4 -2
  430. package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js.map +1 -1
  431. package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js +5 -5
  432. package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js.map +1 -1
  433. package/dist/server/hono/hubspot-connect-routes/oauth-client.js.map +1 -1
  434. package/dist/server/hono/hubspot-connect-routes/utils.js +53 -6
  435. package/dist/server/hono/hubspot-connect-routes/utils.js.map +1 -1
  436. package/dist/server/hono/hubspot-connect-routes/whoami.js +51 -0
  437. package/dist/server/hono/hubspot-connect-routes/whoami.js.map +1 -0
  438. package/dist/server/hono/types.d.ts +9 -10
  439. package/dist/server/hono/utils/cookie-utils.js +2 -1
  440. package/dist/server/hono/utils/cookie-utils.js.map +1 -1
  441. package/dist/server/hono/utils/cors-middleware.js +85 -0
  442. package/dist/server/hono/utils/cors-middleware.js.map +1 -0
  443. package/dist/server/import-app-keys.js.map +1 -1
  444. package/dist/server/lovable/create-app-function-start.d.ts +1 -1
  445. package/dist/server/lovable/create-app-function-start.js +4 -6
  446. package/dist/server/lovable/create-app-function-start.js.map +1 -1
  447. package/dist/server/lovable/hubspot-connect/index.js.map +1 -1
  448. package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js +14 -15
  449. package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js.map +1 -1
  450. package/dist/server/sanitize-request.js +14 -11
  451. package/dist/server/sanitize-request.js.map +1 -1
  452. package/dist/server/secure-start-core.js +4 -5
  453. package/dist/server/secure-start-core.js.map +1 -1
  454. package/dist/server/shared/constants.js +22 -9
  455. package/dist/server/shared/constants.js.map +1 -1
  456. package/dist/server/shared/encoding/base64.js.map +1 -1
  457. package/dist/server/shared/encoding/sha256.js.map +1 -1
  458. package/dist/server/shared/logger.js.map +1 -1
  459. package/dist/server/types.d.ts +1 -35
  460. package/dist/server/utils/cookie-utils.js.map +1 -1
  461. package/dist/server/utils/dpop-utils.js.map +1 -1
  462. package/dist/server/utils/env-utils.js +60 -7
  463. package/dist/server/utils/env-utils.js.map +1 -1
  464. package/dist/server/utils/hubspot-dpop-auth-headers.js +38 -0
  465. package/dist/server/utils/hubspot-dpop-auth-headers.js.map +1 -0
  466. package/dist/server/utils/jwk-utils.js.map +1 -1
  467. package/dist/server/utils/jwt-utils.js.map +1 -1
  468. package/package.json +15 -21
  469. package/src/browser/app-connect-controller/README.md +5 -2
  470. package/src/browser/app-connect-controller/connect-start.test.ts +157 -0
  471. package/src/browser/app-connect-controller/connect-start.ts +18 -3
  472. package/src/browser/app-connect-controller/constants.ts +6 -4
  473. package/src/browser/app-connect-controller/create.ts +8 -2
  474. package/src/browser/app-connect-controller/disconnect.ts +5 -7
  475. package/src/browser/app-connect-controller/init.test.ts +275 -0
  476. package/src/browser/app-connect-controller/init.ts +44 -19
  477. package/src/browser/app-connect-controller/oauth-complete.test.ts +110 -0
  478. package/src/browser/app-connect-controller/oauth-complete.ts +53 -0
  479. package/src/browser/app-connect-controller/oauth-popup.test.ts +239 -0
  480. package/src/browser/app-connect-controller/oauth-popup.ts +160 -0
  481. package/src/browser/app-connect-controller/types.ts +3 -0
  482. package/src/browser/app-connect-controller/utils/iframe-utils.ts +12 -0
  483. package/src/browser/app-connect-controller/utils/resolve-oauth-connect-mode.test.ts +35 -0
  484. package/src/browser/app-connect-controller/utils/resolve-oauth-connect-mode.ts +21 -0
  485. package/src/browser/app-connect-controller/utils/session-utils.test.ts +73 -22
  486. package/src/browser/app-connect-controller/utils/session-utils.ts +74 -33
  487. package/src/browser/app-connect-controller/view-state.test.ts +1 -0
  488. package/src/browser/app-connect-controller/view-state.ts +1 -0
  489. package/src/browser/index.ts +1 -0
  490. package/src/browser/react/components/AppConnectHeader/AppConnectHeader.tsx +21 -34
  491. package/src/browser/react/components/ConnectButton/ConnectButton.tsx +1 -1
  492. package/src/browser/react/lovable/LovableHubSpotAppConnect.tsx +12 -2
  493. package/src/browser/types.ts +30 -5
  494. package/src/server/api-client-core/__tests__/errors.test.ts +309 -0
  495. package/src/server/api-client-core/__tests__/operation-headers.test.ts +251 -0
  496. package/src/server/api-client-core/apis/account/account-info-types.generated.ts +74 -88
  497. package/src/server/api-client-core/apis/account/account-info.generated.ts +2 -4
  498. package/src/server/api-client-core/apis/account/audit-logs-types.generated.ts +346 -360
  499. package/src/server/api-client-core/apis/account/audit-logs.generated.ts +2 -4
  500. package/src/server/api-client-core/apis/auth/oauth-types.generated.ts +81 -99
  501. package/src/server/api-client-core/apis/auth/oauth.generated.ts +1 -3
  502. package/src/server/api-client-core/apis/automation/actions-types.generated.ts +1162 -1188
  503. package/src/server/api-client-core/apis/automation/actions.generated.ts +10 -12
  504. package/src/server/api-client-core/apis/automation/sequences-types.generated.ts +379 -393
  505. package/src/server/api-client-core/apis/automation/sequences.generated.ts +1 -3
  506. package/src/server/api-client-core/apis/business-units-types.generated.ts +43 -59
  507. package/src/server/api-client-core/apis/business-units.generated.ts +9 -10
  508. package/src/server/api-client-core/apis/cms/authors-types.generated.ts +3823 -3853
  509. package/src/server/api-client-core/apis/cms/authors.generated.ts +31 -37
  510. package/src/server/api-client-core/apis/cms/blog-settings-types.generated.ts +3667 -3696
  511. package/src/server/api-client-core/apis/cms/blog-settings.generated.ts +46 -51
  512. package/src/server/api-client-core/apis/cms/cms-content-audit-types.generated.ts +138 -163
  513. package/src/server/api-client-core/apis/cms/cms-content-audit.generated.ts +2 -10
  514. package/src/server/api-client-core/apis/cms/domains-types.generated.ts +153 -167
  515. package/src/server/api-client-core/apis/cms/domains.generated.ts +2 -4
  516. package/src/server/api-client-core/apis/cms/hubdb-types.generated.ts +1013 -1063
  517. package/src/server/api-client-core/apis/cms/hubdb.generated.ts +3 -5
  518. package/src/server/api-client-core/apis/cms/media-bridge-types.generated.ts +8623 -8657
  519. package/src/server/api-client-core/apis/cms/media-bridge.generated.ts +16 -22
  520. package/src/server/api-client-core/apis/cms/pages-types.generated.ts +5259 -5272
  521. package/src/server/api-client-core/apis/cms/pages.generated.ts +262 -226
  522. package/src/server/api-client-core/apis/cms/posts-types.generated.ts +4420 -4438
  523. package/src/server/api-client-core/apis/cms/posts.generated.ts +108 -106
  524. package/src/server/api-client-core/apis/cms/site-search-types.generated.ts +1867 -1881
  525. package/src/server/api-client-core/apis/cms/site-search.generated.ts +2 -4
  526. package/src/server/api-client-core/apis/cms/source-code-types.generated.ts +144 -177
  527. package/src/server/api-client-core/apis/cms/source-code.generated.ts +15 -23
  528. package/src/server/api-client-core/apis/cms/tags-types.generated.ts +3820 -3845
  529. package/src/server/api-client-core/apis/cms/tags.generated.ts +80 -82
  530. package/src/server/api-client-core/apis/cms/url-mappings-types.generated.ts +188 -202
  531. package/src/server/api-client-core/apis/cms/url-mappings.generated.ts +2 -4
  532. package/src/server/api-client-core/apis/cms/url-redirects-types.generated.ts +182 -196
  533. package/src/server/api-client-core/apis/cms/url-redirects.generated.ts +2 -4
  534. package/src/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.ts +810 -828
  535. package/src/server/api-client-core/apis/communication-preferences/subscriptions.generated.ts +66 -63
  536. package/src/server/api-client-core/apis/conversations/custom-channels-types.generated.ts +564 -601
  537. package/src/server/api-client-core/apis/conversations/custom-channels.generated.ts +90 -86
  538. package/src/server/api-client-core/apis/conversations/visitor-identification-types.generated.ts +31 -44
  539. package/src/server/api-client-core/apis/conversations/visitor-identification.generated.ts +6 -8
  540. package/src/server/api-client-core/apis/conversations-types.generated.ts +955 -991
  541. package/src/server/api-client-core/apis/conversations.generated.ts +6 -5
  542. package/src/server/api-client-core/apis/crm/app-uninstalls-types.generated.ts +7 -19
  543. package/src/server/api-client-core/apis/crm/app-uninstalls.generated.ts +2 -4
  544. package/src/server/api-client-core/apis/crm/appointments-types.generated.ts +965 -969
  545. package/src/server/api-client-core/apis/crm/appointments.generated.ts +143 -137
  546. package/src/server/api-client-core/apis/crm/associations-schema-types.generated.ts +292 -322
  547. package/src/server/api-client-core/apis/crm/associations-schema.generated.ts +17 -19
  548. package/src/server/api-client-core/apis/crm/associations-types.generated.ts +657 -675
  549. package/src/server/api-client-core/apis/crm/associations.generated.ts +70 -70
  550. package/src/server/api-client-core/apis/crm/calling-extensions-types.generated.ts +417 -441
  551. package/src/server/api-client-core/apis/crm/calling-extensions.generated.ts +62 -69
  552. package/src/server/api-client-core/apis/crm/calls-types.generated.ts +839 -856
  553. package/src/server/api-client-core/apis/crm/calls.generated.ts +42 -44
  554. package/src/server/api-client-core/apis/crm/carts-types.generated.ts +839 -856
  555. package/src/server/api-client-core/apis/crm/carts.generated.ts +42 -44
  556. package/src/server/api-client-core/apis/crm/commerce-payments-types.generated.ts +847 -856
  557. package/src/server/api-client-core/apis/crm/commerce-payments.generated.ts +73 -73
  558. package/src/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.ts +844 -853
  559. package/src/server/api-client-core/apis/crm/commerce-subscriptions.generated.ts +50 -51
  560. package/src/server/api-client-core/apis/crm/communications-types.generated.ts +846 -856
  561. package/src/server/api-client-core/apis/crm/communications.generated.ts +73 -73
  562. package/src/server/api-client-core/apis/crm/companies-types.generated.ts +859 -885
  563. package/src/server/api-client-core/apis/crm/companies.generated.ts +44 -50
  564. package/src/server/api-client-core/apis/crm/contacts-types.generated.ts +875 -907
  565. package/src/server/api-client-core/apis/crm/contacts.generated.ts +46 -52
  566. package/src/server/api-client-core/apis/crm/contracts-types.generated.ts +894 -862
  567. package/src/server/api-client-core/apis/crm/contracts.generated.ts +66 -56
  568. package/src/server/api-client-core/apis/crm/courses-types.generated.ts +842 -859
  569. package/src/server/api-client-core/apis/crm/courses.generated.ts +42 -44
  570. package/src/server/api-client-core/apis/crm/crm-owners-types.generated.ts +102 -115
  571. package/src/server/api-client-core/apis/crm/crm-owners.generated.ts +2 -4
  572. package/src/server/api-client-core/apis/crm/custom-objects-types.generated.ts +900 -915
  573. package/src/server/api-client-core/apis/crm/custom-objects.generated.ts +128 -126
  574. package/src/server/api-client-core/apis/crm/deal-splits-types.generated.ts +157 -170
  575. package/src/server/api-client-core/apis/crm/deal-splits.generated.ts +2 -4
  576. package/src/server/api-client-core/apis/crm/deals-types.generated.ts +858 -875
  577. package/src/server/api-client-core/apis/crm/deals.generated.ts +42 -44
  578. package/src/server/api-client-core/apis/crm/discounts-types.generated.ts +842 -855
  579. package/src/server/api-client-core/apis/crm/discounts.generated.ts +42 -44
  580. package/src/server/api-client-core/apis/crm/emails-types.generated.ts +839 -856
  581. package/src/server/api-client-core/apis/crm/emails.generated.ts +42 -44
  582. package/src/server/api-client-core/apis/crm/exports-types.generated.ts +284 -314
  583. package/src/server/api-client-core/apis/crm/exports.generated.ts +6 -11
  584. package/src/server/api-client-core/apis/crm/feedback-submissions-types.generated.ts +607 -622
  585. package/src/server/api-client-core/apis/crm/feedback-submissions.generated.ts +84 -80
  586. package/src/server/api-client-core/apis/crm/fees-types.generated.ts +839 -856
  587. package/src/server/api-client-core/apis/crm/fees.generated.ts +42 -44
  588. package/src/server/api-client-core/apis/crm/goal-targets-types.generated.ts +845 -856
  589. package/src/server/api-client-core/apis/crm/goal-targets.generated.ts +50 -51
  590. package/src/server/api-client-core/apis/crm/imports-types.generated.ts +663 -692
  591. package/src/server/api-client-core/apis/crm/imports.generated.ts +2 -7
  592. package/src/server/api-client-core/apis/crm/invoices-types.generated.ts +839 -856
  593. package/src/server/api-client-core/apis/crm/invoices.generated.ts +42 -44
  594. package/src/server/api-client-core/apis/crm/leads-types.generated.ts +839 -856
  595. package/src/server/api-client-core/apis/crm/leads.generated.ts +42 -44
  596. package/src/server/api-client-core/apis/crm/limits-tracking-types.generated.ts +263 -275
  597. package/src/server/api-client-core/apis/crm/limits-tracking.generated.ts +2 -4
  598. package/src/server/api-client-core/apis/crm/line-items-types.generated.ts +843 -856
  599. package/src/server/api-client-core/apis/crm/line-items.generated.ts +42 -44
  600. package/src/server/api-client-core/apis/crm/listings-types.generated.ts +842 -859
  601. package/src/server/api-client-core/apis/crm/listings.generated.ts +42 -44
  602. package/src/server/api-client-core/apis/crm/lists-types.generated.ts +2794 -2845
  603. package/src/server/api-client-core/apis/crm/lists.generated.ts +8 -20
  604. package/src/server/api-client-core/apis/crm/meetings-types.generated.ts +839 -856
  605. package/src/server/api-client-core/apis/crm/meetings.generated.ts +42 -44
  606. package/src/server/api-client-core/apis/crm/notes-types.generated.ts +839 -856
  607. package/src/server/api-client-core/apis/crm/notes.generated.ts +42 -44
  608. package/src/server/api-client-core/apis/crm/object-library-types.generated.ts +26 -39
  609. package/src/server/api-client-core/apis/crm/object-library.generated.ts +2 -4
  610. package/src/server/api-client-core/apis/crm/objects-types.generated.ts +688 -716
  611. package/src/server/api-client-core/apis/crm/objects.generated.ts +79 -83
  612. package/src/server/api-client-core/apis/crm/orders-types.generated.ts +829 -846
  613. package/src/server/api-client-core/apis/crm/orders.generated.ts +45 -47
  614. package/src/server/api-client-core/apis/crm/partner-clients-types.generated.ts +721 -735
  615. package/src/server/api-client-core/apis/crm/partner-clients.generated.ts +60 -60
  616. package/src/server/api-client-core/apis/crm/partner-services-types.generated.ts +720 -734
  617. package/src/server/api-client-core/apis/crm/partner-services.generated.ts +60 -60
  618. package/src/server/api-client-core/apis/crm/pipelines-types.generated.ts +366 -388
  619. package/src/server/api-client-core/apis/crm/pipelines.generated.ts +2 -4
  620. package/src/server/api-client-core/apis/crm/postal-mail-types.generated.ts +830 -843
  621. package/src/server/api-client-core/apis/crm/postal-mail.generated.ts +45 -47
  622. package/src/server/api-client-core/apis/crm/products-types.generated.ts +829 -846
  623. package/src/server/api-client-core/apis/crm/products.generated.ts +45 -47
  624. package/src/server/api-client-core/apis/crm/projects-types.generated.ts +845 -875
  625. package/src/server/api-client-core/apis/crm/projects.generated.ts +47 -53
  626. package/src/server/api-client-core/apis/crm/properties-types.generated.ts +623 -626
  627. package/src/server/api-client-core/apis/crm/properties.generated.ts +33 -28
  628. package/src/server/api-client-core/apis/crm/property-validations-types.generated.ts +160 -174
  629. package/src/server/api-client-core/apis/crm/property-validations.generated.ts +2 -6
  630. package/src/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.ts +467 -494
  631. package/src/server/api-client-core/apis/crm/public-app-crm-cards.generated.ts +7 -15
  632. package/src/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.ts +166 -177
  633. package/src/server/api-client-core/apis/crm/public-app-feature-flags.generated.ts +6 -8
  634. package/src/server/api-client-core/apis/crm/quotes-types.generated.ts +829 -846
  635. package/src/server/api-client-core/apis/crm/quotes.generated.ts +45 -47
  636. package/src/server/api-client-core/apis/crm/schemas-types.generated.ts +613 -640
  637. package/src/server/api-client-core/apis/crm/schemas.generated.ts +8 -14
  638. package/src/server/api-client-core/apis/crm/services-types.generated.ts +832 -849
  639. package/src/server/api-client-core/apis/crm/services.generated.ts +45 -47
  640. package/src/server/api-client-core/apis/crm/tasks-types.generated.ts +829 -846
  641. package/src/server/api-client-core/apis/crm/tasks.generated.ts +45 -47
  642. package/src/server/api-client-core/apis/crm/taxes-types.generated.ts +829 -846
  643. package/src/server/api-client-core/apis/crm/taxes.generated.ts +45 -47
  644. package/src/server/api-client-core/apis/crm/tickets-types.generated.ts +848 -878
  645. package/src/server/api-client-core/apis/crm/tickets.generated.ts +47 -53
  646. package/src/server/api-client-core/apis/crm/timeline-types.generated.ts +144 -161
  647. package/src/server/api-client-core/apis/crm/timeline.generated.ts +6 -8
  648. package/src/server/api-client-core/apis/crm/transcriptions-types.generated.ts +149 -164
  649. package/src/server/api-client-core/apis/crm/transcriptions.generated.ts +22 -22
  650. package/src/server/api-client-core/apis/crm/users-types.generated.ts +829 -846
  651. package/src/server/api-client-core/apis/crm/users.generated.ts +45 -47
  652. package/src/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.ts +29 -42
  653. package/src/server/api-client-core/apis/crm/video-conferencing-extension.generated.ts +17 -19
  654. package/src/server/api-client-core/apis/events/manage-event-definitions-types.generated.ts +1509 -1558
  655. package/src/server/api-client-core/apis/events/manage-event-definitions.generated.ts +55 -65
  656. package/src/server/api-client-core/apis/events/send-event-completions-types.generated.ts +51 -68
  657. package/src/server/api-client-core/apis/events/send-event-completions.generated.ts +10 -10
  658. package/src/server/api-client-core/apis/events-types.generated.ts +97 -110
  659. package/src/server/api-client-core/apis/events.generated.ts +2 -4
  660. package/src/server/api-client-core/apis/files-types.generated.ts +727 -757
  661. package/src/server/api-client-core/apis/files.generated.ts +3 -5
  662. package/src/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.ts +1221 -1234
  663. package/src/server/api-client-core/apis/marketing/campaigns-public-api.generated.ts +45 -47
  664. package/src/server/api-client-core/apis/marketing/marketing-emails-types.generated.ts +3704 -3733
  665. package/src/server/api-client-core/apis/marketing/marketing-emails.generated.ts +44 -52
  666. package/src/server/api-client-core/apis/marketing/marketing-events-types.generated.ts +1787 -1848
  667. package/src/server/api-client-core/apis/marketing/marketing-events.generated.ts +236 -241
  668. package/src/server/api-client-core/apis/marketing/single-send-types.generated.ts +142 -155
  669. package/src/server/api-client-core/apis/marketing/single-send.generated.ts +2 -6
  670. package/src/server/api-client-core/apis/marketing/transactional-single-send-types.generated.ts +253 -269
  671. package/src/server/api-client-core/apis/marketing/transactional-single-send.generated.ts +32 -31
  672. package/src/server/api-client-core/apis/meta/origins-types.generated.ts +40 -56
  673. package/src/server/api-client-core/apis/meta/origins.generated.ts +2 -4
  674. package/src/server/api-client-core/apis/scheduler/meetings-types.generated.ts +1001 -1014
  675. package/src/server/api-client-core/apis/scheduler/meetings.generated.ts +6 -8
  676. package/src/server/api-client-core/apis/settings/multicurrency-types.generated.ts +1906 -1912
  677. package/src/server/api-client-core/apis/settings/multicurrency.generated.ts +64 -63
  678. package/src/server/api-client-core/apis/settings/tax-rates-types.generated.ts +71 -85
  679. package/src/server/api-client-core/apis/settings/tax-rates.generated.ts +2 -4
  680. package/src/server/api-client-core/apis/settings/user-provisioning-types.generated.ts +207 -257
  681. package/src/server/api-client-core/apis/settings/user-provisioning.generated.ts +8 -24
  682. package/src/server/api-client-core/apis/webhooks-journal-types.generated.ts +740 -771
  683. package/src/server/api-client-core/apis/webhooks-journal.generated.ts +47 -59
  684. package/src/server/api-client-core/apis/webhooks-types.generated.ts +1194 -1228
  685. package/src/server/api-client-core/apis/webhooks.generated.ts +52 -64
  686. package/src/server/api-client-core/client.ts +5 -1
  687. package/src/server/api-client-core/pagination.ts +2 -2
  688. package/src/server/api-client-core/plugins/fetch-transport.ts +70 -12
  689. package/src/server/api-client-core/types.ts +1 -1
  690. package/src/server/constants.ts +29 -4
  691. package/src/server/hono/hono-request-handler.ts +68 -27
  692. package/src/server/hono/hubspot-connect-routes/auth-complete.test.ts +394 -0
  693. package/src/server/hono/hubspot-connect-routes/{auth-callback.ts → auth-complete.ts} +81 -30
  694. package/src/server/hono/hubspot-connect-routes/auth-init-session.test.ts +114 -30
  695. package/src/server/hono/hubspot-connect-routes/auth-init-session.ts +35 -10
  696. package/src/server/hono/hubspot-connect-routes/auth-logout.test.ts +13 -0
  697. package/src/server/hono/hubspot-connect-routes/auth-logout.ts +39 -10
  698. package/src/server/hono/hubspot-connect-routes/auth-refresh.test.ts +6 -0
  699. package/src/server/hono/hubspot-connect-routes/auth-refresh.ts +24 -9
  700. package/src/server/hono/hubspot-connect-routes/cimd-public-routes.test.ts +7 -6
  701. package/src/server/hono/hubspot-connect-routes/cimd-public-routes.ts +5 -1
  702. package/src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts +11 -3
  703. package/src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts +17 -24
  704. package/src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts +8 -8
  705. package/src/server/hono/hubspot-connect-routes/utils.test.ts +16 -46
  706. package/src/server/hono/hubspot-connect-routes/utils.ts +61 -5
  707. package/src/server/hono/hubspot-connect-routes/whoami.ts +74 -0
  708. package/src/server/hono/types.ts +11 -10
  709. package/src/server/hono/utils/cookie-utils.ts +27 -2
  710. package/src/server/hono/utils/cors-middleware.test.ts +80 -0
  711. package/src/server/hono/utils/cors-middleware.ts +95 -0
  712. package/src/server/lovable/create-app-function-start.ts +4 -7
  713. package/src/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.ts +21 -16
  714. package/src/server/sanitize-request.ts +15 -12
  715. package/src/server/secure-start-core.ts +7 -6
  716. package/src/server/types.ts +2 -38
  717. package/src/server/utils/env-utils.test.ts +140 -12
  718. package/src/server/utils/env-utils.ts +80 -6
  719. package/src/server/utils/hubspot-dpop-auth-headers.test.ts +43 -0
  720. package/src/server/utils/hubspot-dpop-auth-headers.ts +48 -0
  721. package/src/shared/constants.ts +40 -3
  722. package/src/shared/wire-types.ts +49 -0
  723. package/dist/browser/HubSpotAppConnect-BW45gyDs.js.map +0 -1
  724. package/dist/browser/create-vctOhpX9.js.map +0 -1
  725. package/dist/server/hono/hubspot-connect-routes/auth-callback.js +0 -125
  726. package/dist/server/hono/hubspot-connect-routes/auth-callback.js.map +0 -1
  727. package/dist/server/proxy.js +0 -68
  728. package/dist/server/proxy.js.map +0 -1
  729. package/src/server/hono/hubspot-connect-routes/auth-callback.test.ts +0 -225
  730. package/src/server/proxy.test.ts +0 -80
  731. package/src/server/proxy.ts +0 -116
@@ -15,6 +15,55 @@ export interface InitSessionResponse {
15
15
  authorization_url: string;
16
16
  }
17
17
 
18
+ export interface AuthCompleteWhoamiUser {
19
+ id?: string | undefined;
20
+ email?: string | undefined;
21
+ firstName?: string | undefined;
22
+ lastName?: string | undefined;
23
+ }
24
+
25
+ export interface AuthCompleteWhoamiHub {
26
+ id?: number | undefined;
27
+ domain?: string | undefined;
28
+ uiDomain?: string | undefined;
29
+ }
30
+
31
+ /**
32
+ * Identity information for the authenticated user and their HubSpot
33
+ * account. Both fields are optional because the access token may not
34
+ * carry the scopes needed to fetch each piece (`public-users-read` for
35
+ * `user`, `external-settings-access` for `hub`).
36
+ */
37
+ export interface AuthCompleteWhoami {
38
+ user: AuthCompleteWhoamiUser;
39
+ hub: AuthCompleteWhoamiHub;
40
+ }
41
+
42
+ /**
43
+ * Body returned by `POST /auth/complete` once the SDK has exchanged
44
+ * the OAuth authorization code for an access + refresh token. The
45
+ * SDK has set the durable session cookies on the response by this
46
+ * point; the browser controller uses these fields to update its
47
+ * client-side expiry tracking and to navigate the user back to the
48
+ * page they started the connect flow from.
49
+ */
50
+ export interface AuthCompleteResponse {
51
+ /** Access-token expiry as Unix epoch milliseconds. */
52
+ expires_at: number;
53
+ /**
54
+ * Path the browser should land on after the connect flow finishes,
55
+ * carried through the OAuth `state` round-trip. Always begins with
56
+ * `/` and is restricted to safe internal paths.
57
+ */
58
+ return_path: string;
59
+ /**
60
+ * Identity of the authenticated user and their HubSpot account.
61
+ * Populated on a best-effort basis — fields are absent when the
62
+ * access token lacks the required scopes.
63
+ */
64
+ whoami: AuthCompleteWhoami;
65
+ }
66
+
18
67
  /**
19
68
  * Body returned by `POST /auth/refresh` after a successful access-token
20
69
  * refresh.
@@ -1 +0,0 @@
1
- {"version":3,"file":"HubSpotAppConnect-BW45gyDs.js","names":["styles.root","styles.variant","variant","styles.size","size","styles","styles","styles","styles"],"sources":["../../src/browser/react/context.ts","../../src/browser/react/hooks.ts","../../src/browser/react/components/Button/Button.css.ts","../../src/browser/react/components/Button/Button.tsx","../../src/browser/react/components/ConnectButton/ConnectButton.css.ts","../../src/browser/react/components/ConnectButton/ConnectButton.tsx","../../src/browser/react/components/icons/ChevronDownIcon.tsx","../../src/browser/react/components/icons/ExternalLinkIcon.tsx","../../src/browser/react/components/icons/HubSpotDataSourceIcon.tsx","../../src/browser/react/components/icons/LogoutIcon.tsx","../../src/browser/react/components/icons/ShareIcon.tsx","../../src/browser/react/components/ShareButton/ShareButton.css.ts","../../src/browser/react/components/ShareButton/ShareButton.tsx","../../src/browser/react/components/AppConnectHeader/AppConnectHeader.css.ts","../../src/browser/react/components/AppConnectHeader/AppConnectHeader.tsx","../../src/browser/react/components/DisconnectedBody/DisconnectedBody.css.ts","../../src/browser/react/components/DisconnectedBody/DisconnectedBody.tsx","../../src/browser/react/components/LoadingIndicator/LoadingIndicator.css.ts","../../src/browser/react/components/LoadingIndicator/LoadingIndicator.tsx","../../src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.css.ts","../../src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.tsx"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { AppConnectController } from '../types.ts';\n\n/**\n * React context that carries the `AppConnectController` from the\n * `HubSpotAppConnect` provider down to consumers of\n * `useHubSpotAppConnect`. `null` indicates the hook is being used\n * outside a provider.\n */\nexport const HubSpotAppConnectControllerContext =\n createContext<AppConnectController | null>(null);\n","import { useContext, useSyncExternalStore } from 'react';\n\nimport type { AppConnectState } from '../types.ts';\nimport { HubSpotAppConnectControllerContext } from './context.ts';\n\nexport type UseHubSpotAppConnectResult = AppConnectState;\n\n/**\n * React hook that returns the current `AppConnectState`. Must be\n * called inside a {@link HubSpotAppConnect} provider — throws when\n * no controller is available.\n *\n * The hook subscribes to the controller via `useSyncExternalStore`\n * so React 18+ batched updates and SSR work correctly.\n */\nexport function useHubSpotAppConnect(): UseHubSpotAppConnectResult {\n const controller = useContext(HubSpotAppConnectControllerContext);\n if (controller == null) {\n throw new Error(\n 'useHubSpotAppConnect must be used within HubSpotAppConnect'\n );\n }\n return useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getServerSnapshot\n );\n}\n","import { style, styleVariants } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const root = style({\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n font: 'inherit',\n fontWeight: 500,\n lineHeight: 'inherit',\n textAlign: 'center',\n cursor: 'pointer',\n borderWidth: 1,\n borderStyle: 'solid',\n borderRadius: themeVars.borderRadius[100],\n transition:\n 'background-color 120ms ease, border-color 120ms ease, color 120ms ease, opacity 120ms ease',\n selectors: {\n '&:disabled': {\n cursor: 'wait',\n opacity: 0.55,\n },\n },\n});\n\nexport const variant = styleVariants({\n primary: {\n backgroundColor: themeVars.fill.primary.default,\n color: themeVars.text.primary.default,\n borderColor: themeVars.border.primary.default,\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.95)',\n },\n },\n },\n secondary: {\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderColor: themeVars.border.core.default,\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: '#f7f7f7',\n },\n },\n },\n});\n\nexport const size = styleVariants({\n md: {\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n fontSize: 14,\n },\n lg: {\n padding: `${themeVars.space[300]} ${themeVars.space[500]}`,\n fontSize: 16,\n },\n});\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nimport * as styles from './Button.css.ts';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonSize = 'md' | 'lg';\n\nexport interface ButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n children: ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({\n children,\n className,\n variant = 'primary',\n size = 'md',\n type = 'button',\n ...rest\n}: ButtonProps) {\n const composedClassName = [\n styles.root,\n styles.variant[variant],\n styles.size[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button {...rest} type={type} className={composedClassName}>\n {children}\n </button>\n );\n}\n","import { keyframes, style, styleVariants } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst spin = keyframes({\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const root = style({\n position: 'relative',\n});\n\nexport const label = style({\n position: 'relative',\n zIndex: 0,\n});\n\nexport const labelMuted = style({\n opacity: 0.22,\n});\n\nexport const loadingBackdrop = styleVariants({\n primary: {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n marginLeft: -18,\n marginTop: -18,\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.88)',\n boxShadow: '0 1px 6px rgba(0, 0, 0, 0.14)',\n pointerEvents: 'none',\n },\n secondary: {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n marginLeft: -18,\n marginTop: -18,\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.82)',\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.08)',\n pointerEvents: 'none',\n },\n});\n\nexport const spinner = style({\n display: 'block',\n width: 14,\n height: 14,\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderTopColor: themeVars.fill.primary.default,\n borderRadius: '50%',\n animation: `${spin} 0.8s linear infinite`,\n});\n","import { useHubSpotAppConnect } from '../../hooks.ts';\nimport type { ButtonProps } from '../Button/Button.tsx';\nimport { Button } from '../Button/Button.tsx';\nimport {\n label,\n labelMuted,\n loadingBackdrop,\n root,\n spinner,\n} from './ConnectButton.css.ts';\n\nexport interface ConnectButtonProps extends Pick<\n ButtonProps,\n 'variant' | 'size' | 'className'\n> {}\n\nexport function ConnectButton({\n variant = 'primary',\n size = 'md',\n className,\n}: ConnectButtonProps) {\n const { status, connectToHubSpot } = useHubSpotAppConnect();\n const isConnecting = status === 'connecting';\n const composedClassName = [root, className].filter(Boolean).join(' ');\n const labelClassName = isConnecting ? `${label} ${labelMuted}` : label;\n return (\n <Button\n variant={variant}\n size={size}\n className={composedClassName}\n aria-busy={isConnecting}\n onClick={() => void connectToHubSpot()}\n disabled={isConnecting}\n >\n <span className={labelClassName}>Connect to HubSpot</span>\n {isConnecting ? (\n <span className={loadingBackdrop[variant]} aria-hidden=\"true\">\n <span className={spinner} />\n </span>\n ) : null}\n </Button>\n );\n}\n","export interface ChevronDownIconProps {\n className?: string;\n}\n\nexport function ChevronDownIcon({ className }: ChevronDownIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface ExternalLinkIconProps {\n className?: string;\n}\n\nexport function ExternalLinkIcon({ className }: ExternalLinkIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.5 3.5H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2.5M10 2.5h3.5V6M9 7l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface HubSpotDataSourceIconProps {\n className?: string;\n}\n\nexport function HubSpotDataSourceIcon({\n className,\n}: HubSpotDataSourceIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"2.5\"\n y=\"2.5\"\n width=\"11\"\n height=\"11\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M5 6h6M5 8.25h6M5 10.5h4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","export interface LogoutIconProps {\n className?: string;\n}\n\nexport function LogoutIcon({ className }: LogoutIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.5 2.5h-3a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 11l3-3-3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M13.5 8h-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface ShareIconProps {\n className?: string;\n}\n\nexport function ShareIcon({ className }: ShareIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"18\" cy=\"5\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6\" cy=\"12\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle\n cx=\"18\"\n cy=\"19\"\n r=\"2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.6 10.5L15.4 6.5M8.6 13.5L15.4 17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst shareBorder = '#cbd6e2';\nconst shareText = '#33475b';\n\nexport const styles = {\n shareButton: style({\n flexShrink: 0,\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n fontFamily: 'inherit',\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: themeVars.space[200],\n padding: `8px ${themeVars.space[300]}`,\n color: shareText,\n backgroundColor: themeVars.fill.surface.default.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: shareBorder,\n borderRadius: 100,\n transition:\n 'background-color 120ms ease, border-color 120ms ease, color 120ms ease',\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: '#f5f8fa',\n },\n '&:focus-visible': {\n outline: `2px solid ${themeVars.border.tertiary.default}`,\n outlineOffset: 2,\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.55,\n },\n },\n }),\n shareIcon: style({\n width: 16,\n height: 16,\n flexShrink: 0,\n display: 'block',\n }),\n} as const;\n","import { ShareIcon } from '../icons/ShareIcon.tsx';\nimport { styles } from './ShareButton.css.ts';\n\ninterface ShareAppConnectPageOptions {\n pageTitle: string;\n}\n\nasync function shareAppConnectPage(\n options: ShareAppConnectPageOptions\n): Promise<void> {\n const { pageTitle } = options;\n const url = window.location.href;\n if (typeof navigator.share === 'function') {\n try {\n await navigator.share({ title: pageTitle, text: pageTitle, url });\n return;\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n }\n }\n if (typeof navigator.clipboard?.writeText === 'function') {\n await navigator.clipboard.writeText(url);\n }\n}\n\nexport interface ShareButtonProps {\n pageTitle: string;\n}\n\nexport function ShareButton({ pageTitle }: ShareButtonProps) {\n return (\n <button\n type=\"button\"\n className={styles.shareButton}\n onClick={() => void shareAppConnectPage({ pageTitle })}\n >\n <ShareIcon className={styles.shareIcon} />\n <span>Share</span>\n </button>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst avatarOrange = themeVars.fill.brand.default;\nconst avatarTextColor = themeVars.text.primary.default;\n\nexport const styles = {\n header: style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: themeVars.space[300],\n paddingBottom: themeVars.space[300],\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: themeVars.border.core.subtle.default,\n }),\n titleRow: style({\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n }),\n leftStack: style({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: themeVars.space[200],\n minWidth: 0,\n flex: 1,\n }),\n contextRow: style({\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 14,\n lineHeight: 1.35,\n color: themeVars.text.core.subtle,\n minWidth: 0,\n }),\n contextIcon: style({\n width: 16,\n height: 16,\n flexShrink: 0,\n color: themeVars.text.core.subtle,\n }),\n contextPrefix: style({\n flexShrink: 0,\n }),\n contextLink: style({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n color: themeVars.fill.brand.default,\n textDecoration: 'none',\n fontWeight: 500,\n selectors: {\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n }),\n contextExternalIcon: style({\n width: 14,\n height: 14,\n flexShrink: 0,\n }),\n titleCluster: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n width: 'max-content',\n maxWidth: '100%',\n minWidth: 0,\n }),\n title: style({\n flex: '0 1 auto',\n fontSize: 20,\n fontWeight: 600,\n margin: 0,\n color: themeVars.text.core.default,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n userTrigger: style({\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n font: 'inherit',\n lineHeight: 1,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n padding: `6px ${themeVars.space[300]} 6px 6px`,\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.default,\n borderRadius: 999,\n transition: 'background-color 120ms ease, border-color 120ms ease',\n selectors: {\n '&:hover': {\n backgroundColor: '#f7f7f7',\n },\n '&[data-popup-open]': {\n backgroundColor: '#f7f7f7',\n },\n },\n }),\n triggerName: style({\n fontWeight: 500,\n fontSize: 14,\n }),\n chevron: style({\n width: 14,\n height: 14,\n color: themeVars.text.core.subtle,\n transition: 'transform 150ms ease',\n selectors: {\n '[data-popup-open] &': {\n transform: 'rotate(180deg)',\n },\n },\n }),\n avatar: style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: avatarOrange,\n color: avatarTextColor,\n fontWeight: 600,\n flexShrink: 0,\n borderRadius: '50%',\n userSelect: 'none',\n }),\n avatarSm: style({\n width: 28,\n height: 28,\n fontSize: 11,\n }),\n avatarLg: style({\n width: 40,\n height: 40,\n fontSize: 14,\n }),\n popup: style({\n minWidth: 240,\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderRadius: themeVars.borderRadius[300],\n boxShadow:\n '0 6px 16px rgba(17, 17, 17, 0.08), 0 2px 6px rgba(17, 17, 17, 0.04)',\n padding: `${themeVars.space[200]} 0`,\n outline: 'none',\n transformOrigin: 'top right',\n opacity: 0,\n transform: 'scale(0.96)',\n transition: 'opacity 120ms ease, transform 120ms ease',\n selectors: {\n '&[data-starting-style]': {\n opacity: 0,\n transform: 'scale(0.96)',\n },\n '&[data-open]': {\n opacity: 1,\n transform: 'scale(1)',\n },\n },\n }),\n userInfo: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[300],\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n }),\n userInfoText: style({\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }),\n userInfoName: style({\n fontWeight: 600,\n fontSize: 14,\n color: themeVars.text.core.default,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n userInfoEmail: style({\n fontSize: 13,\n color: themeVars.text.core.subtle,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n separator: style({\n height: 1,\n margin: `${themeVars.space[200]} 0`,\n backgroundColor: themeVars.border.core.subtle.default,\n border: 'none',\n }),\n disconnectItem: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n color: themeVars.text.alert.default,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n outline: 'none',\n userSelect: 'none',\n selectors: {\n '&[data-highlighted]': {\n backgroundColor: themeVars.fill.accent.red.subtle.default,\n },\n },\n }),\n disconnectIcon: style({\n width: 16,\n height: 16,\n }),\n} as const;\n","import { Menu } from '@base-ui/react/menu';\n\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { ConnectButton } from '../ConnectButton/ConnectButton.tsx';\nimport { ChevronDownIcon } from '../icons/ChevronDownIcon.tsx';\nimport { ExternalLinkIcon } from '../icons/ExternalLinkIcon.tsx';\nimport { HubSpotDataSourceIcon } from '../icons/HubSpotDataSourceIcon.tsx';\nimport { LogoutIcon } from '../icons/LogoutIcon.tsx';\nimport { ShareButton } from '../ShareButton/ShareButton.tsx';\nimport { styles } from './AppConnectHeader.css.ts';\n\ninterface FakeUser {\n firstName: string;\n lastName: string;\n email: string;\n}\n\nconst FAKE_USER: FakeUser = {\n firstName: 'Gabby',\n lastName: 'Martinez',\n email: 'gabby.martinez@acmecorp.com',\n};\n\nfunction getUserInitials(user: FakeUser): string {\n const first = user.firstName.charAt(0).toUpperCase();\n const last = user.lastName.charAt(0).toUpperCase();\n return `${first}${last}`;\n}\n\nfunction getFullName(user: FakeUser): string {\n return `${user.firstName} ${user.lastName}`;\n}\n\ninterface AppConnectHeaderProps {\n title: string;\n}\n\nexport function AppConnectHeader({ title }: AppConnectHeaderProps) {\n const { status } = useHubSpotAppConnect();\n return (\n <header className={styles.header}>\n <div className={styles.titleRow}>\n <div className={styles.leftStack}>\n <div className={styles.titleCluster}>\n <h1 className={styles.title}>{title}</h1>\n <ShareButton pageTitle={title} />\n </div>\n {status === 'connected' ? <ViewingHubSpotContextRow /> : null}\n </div>\n </div>\n {status === 'connected' ? (\n <UserMenu />\n ) : (\n <ConnectButton variant=\"secondary\" />\n )}\n </header>\n );\n}\n\nfunction ViewingHubSpotContextRow() {\n return (\n <div className={styles.contextRow}>\n <HubSpotDataSourceIcon className={styles.contextIcon} />\n <span className={styles.contextPrefix}>Viewing HubSpot data from </span>\n <a\n className={styles.contextLink}\n href=\"#\"\n onClick={(event) => {\n event.preventDefault();\n }}\n >\n Acme Corp · HubSpot\n <ExternalLinkIcon className={styles.contextExternalIcon} />\n </a>\n </div>\n );\n}\n\nfunction UserMenu() {\n const { disconnectFromHubSpot } = useHubSpotAppConnect();\n const initials = getUserInitials(FAKE_USER);\n const fullName = getFullName(FAKE_USER);\n\n return (\n <Menu.Root modal={false}>\n <Menu.Trigger className={styles.userTrigger}>\n <span\n className={`${styles.avatar} ${styles.avatarSm}`}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <span className={styles.triggerName}>{fullName}</span>\n <ChevronDownIcon className={styles.chevron} />\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Positioner sideOffset={8} align=\"end\">\n <Menu.Popup className={styles.popup}>\n <div className={styles.userInfo}>\n <span\n className={`${styles.avatar} ${styles.avatarLg}`}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <div className={styles.userInfoText}>\n <span className={styles.userInfoName}>{fullName}</span>\n <span className={styles.userInfoEmail}>{FAKE_USER.email}</span>\n </div>\n </div>\n <Menu.Separator className={styles.separator} />\n <Menu.Item\n className={styles.disconnectItem}\n onClick={() => void disconnectFromHubSpot()}\n >\n <LogoutIcon className={styles.disconnectIcon} />\n Disconnect\n </Menu.Item>\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const styles = {\n card: style({\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.default,\n borderRadius: themeVars.borderRadius[400],\n padding: themeVars.space[500],\n textAlign: 'center',\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n }),\n message: style({\n marginTop: 0,\n marginBottom: themeVars.space[400],\n }),\n errorText: style({\n marginTop: themeVars.space[300],\n marginBottom: 0,\n color: themeVars.text.alert.default,\n }),\n} as const;\n","import type { ReactNode } from 'react';\n\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { ConnectButton } from '../ConnectButton/ConnectButton.tsx';\nimport { styles } from './DisconnectedBody.css.ts';\n\ninterface DisconnectedBodyProps {\n message: ReactNode;\n}\n\nexport function DisconnectedBody({ message }: DisconnectedBodyProps) {\n const { error } = useHubSpotAppConnect();\n\n return (\n <div className={styles.card}>\n <p className={styles.message}>{message}</p>\n <ConnectButton size=\"lg\" />\n {error && (\n <p className={styles.errorText}>\n Failed to connect to HubSpot. {error}\n </p>\n )}\n </div>\n );\n}\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst spin = keyframes({\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const styles = {\n wrapper: style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n padding: themeVars.space[600],\n }),\n spinner: style({\n width: 40,\n height: 40,\n borderWidth: 3,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderTopColor: themeVars.fill.primary.default,\n borderRadius: '50%',\n animation: `${spin} 0.8s linear infinite`,\n }),\n} as const;\n","import { styles } from './LoadingIndicator.css.ts';\n\nexport function LoadingIndicator() {\n return (\n <div className={styles.wrapper} role=\"status\" aria-label=\"Loading\">\n <div className={styles.spinner} />\n </div>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const styles = {\n shell: style({\n width: '100%',\n padding: `${themeVars.space[400]} ${themeVars.space[500]}`,\n }),\n content: style({\n marginTop: themeVars.space[500],\n }),\n connectedErrorBanner: style({\n backgroundColor: themeVars.fill.alert.subtle,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.alert.default,\n borderRadius: themeVars.borderRadius[300],\n padding: themeVars.space[300],\n marginBottom: themeVars.space[300],\n color: themeVars.text.alert.default,\n }),\n} as const;\n","import { useEffect, type ReactNode } from 'react';\n\nimport { themeClass } from '../../../theme.css.ts';\nimport type { AppConnectController } from '../../../types.ts';\nimport { HubSpotAppConnectControllerContext } from '../../context.ts';\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { AppConnectHeader } from '../AppConnectHeader/AppConnectHeader.tsx';\nimport { DisconnectedBody } from '../DisconnectedBody/DisconnectedBody.tsx';\nimport { LoadingIndicator } from '../LoadingIndicator/LoadingIndicator.tsx';\nimport { styles } from './HubSpotAppConnect.css.ts';\n\n/**\n * Props accepted by {@link HubSpotAppConnect}.\n */\nexport interface HubSpotAppConnectProps {\n /** Title text rendered in the standard SDK header. */\n title: string;\n /** Controller produced by `createAppConnectController`. */\n controller: AppConnectController;\n /** Content rendered when the controller is in the `connected` state. */\n connected: ReactNode;\n /**\n * Description text rendered inside the SDK-owned disconnected card,\n * above the primary \"Connect to HubSpot\" button.\n */\n disconnectedMessage: ReactNode;\n}\n\n/**\n * Layout component that exposes `controller` to {@link useHubSpotAppConnect},\n * starts it once on mount, and renders a standard header plus the content\n * slot that matches the current connection status.\n */\nexport function HubSpotAppConnect({\n title,\n controller,\n connected,\n disconnectedMessage,\n}: HubSpotAppConnectProps) {\n useEffect(() => {\n controller.start();\n }, [controller]);\n useEffect(() => {\n document.documentElement.classList.add(themeClass);\n return () => {\n document.documentElement.classList.remove(themeClass);\n };\n }, []);\n return (\n <HubSpotAppConnectControllerContext.Provider value={controller}>\n <div className={styles.shell}>\n <AppConnectHeader title={title} />\n <div className={styles.content}>\n <HubSpotAppConnectContent\n connected={connected}\n disconnectedMessage={disconnectedMessage}\n />\n </div>\n </div>\n </HubSpotAppConnectControllerContext.Provider>\n );\n}\n\ninterface HubSpotAppConnectContentProps {\n connected: ReactNode;\n disconnectedMessage: ReactNode;\n}\n\nfunction HubSpotAppConnectContent({\n connected,\n disconnectedMessage,\n}: HubSpotAppConnectContentProps) {\n const { status, error } = useHubSpotAppConnect();\n if (status === 'initializing') {\n return <LoadingIndicator />;\n }\n if (status === 'connected') {\n return (\n <>\n {error ? (\n <div className={styles.connectedErrorBanner} role=\"alert\">\n {error}\n </div>\n ) : null}\n {connected}\n </>\n );\n }\n return <DisconnectedBody message={disconnectedMessage} />;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-vctOhpX9.js","names":["disconnectFromHubSpot","runDisconnectFromHubSpot"],"sources":["../../src/shared/logger.ts","../../src/browser/app-connect-controller/utils/timeout-utils.ts","../../src/browser/app-connect-controller/connect-start.ts","../../src/browser/app-connect-controller/default-session-storage.ts","../../src/shared/constants.ts","../../src/browser/app-connect-controller/constants.ts","../../src/browser/app-connect-controller/utils/session-utils.ts","../../src/browser/app-connect-controller/disconnect.ts","../../src/browser/app-connect-controller/init.ts","../../src/browser/app-connect-controller/refresh.ts","../../src/browser/app-connect-controller/utils/memoize-utils.ts","../../src/browser/app-connect-controller/utils/store-utils.ts","../../src/browser/app-connect-controller/view-state.ts","../../src/browser/app-connect-controller/create.ts"],"sourcesContent":["/**\n * Pluggable logger contract used by the SDK on both the browser and\n * server. Consumers can pass `console`-like loggers, structured\n * loggers (pino / winston / etc.) or no-op stubs in tests.\n */\nexport interface Logger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nfunction formatPrefix(name: string): string {\n return `[${name}]`;\n}\n\n/**\n * Creates a console-backed logger that prefixes every line with the\n * supplied `name`. Used as the default when no custom logger is\n * provided.\n */\nexport function createLogger(name: string): Logger {\n const prefix = formatPrefix(name);\n return {\n debug: (message, ...args) => {\n console.debug(prefix, message, ...args);\n },\n info: (message, ...args) => {\n console.info(prefix, message, ...args);\n },\n warn: (message, ...args) => {\n console.warn(prefix, message, ...args);\n },\n error: (message, ...args) => {\n console.error(prefix, message, ...args);\n },\n };\n}\n\n/**\n * Logger that swallows every message. Convenient for tests and for\n * the SDK's server-side handlers when no logger is provided by the\n * host application.\n */\nexport const noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n","export function delay(ms: number): Promise<void> {\n if (ms <= 0) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import type { InitSessionResponse } from '../../shared/wire-types.ts';\nimport type { AppConnectContext } from './types.ts';\nimport { delay } from './utils/timeout-utils.ts';\n\n/** Extra wait before redirect so the connect progress UI is visible; set to `0` to disable. */\nconst ARTIFICIAL_CONNECT_REDIRECT_DELAY_MS = 500;\n\n/**\n * Begins the OAuth connect flow:\n *\n * 1. Calls the SDK's `auth/init-session` route to mint a fresh PKCE\n * verifier + state and obtain HubSpot's `authorize` URL.\n * 2. Navigates the browser to that URL (full-page redirect).\n *\n * The `return_path` is the current path + query so the user lands\n * back where they started after authorizing.\n *\n * Throws when the init call fails. Does not return after the redirect\n * begins because the page is unloaded.\n */\nexport async function startHubSpotConnection(\n context: AppConnectContext\n): Promise<void> {\n const { config } = context;\n\n const returnPath = `${window.location.pathname}${window.location.search}`;\n\n const initUrl = new URL(\n `${config.hubSpotConnectBaseUrl}/auth/init-session`,\n window.location.origin\n );\n initUrl.searchParams.set('return_path', returnPath);\n\n const initResponse = await fetch(initUrl.toString(), {\n credentials: 'include',\n });\n if (!initResponse.ok)\n throw new Error(`Failed to init session: ${initResponse.status}`);\n const { authorization_url: authorizationUrl } =\n (await initResponse.json()) as InitSessionResponse;\n\n await delay(ARTIFICIAL_CONNECT_REDIRECT_DELAY_MS);\n\n window.location.href = authorizationUrl;\n}\n","import type { SessionStorage } from './types.ts';\n\n/**\n * Builds a `SessionStorage` adapter that delegates to the global\n * `sessionStorage` object exposed by browsers. The controller uses\n * this when no custom storage is supplied (e.g. for tests or non-DOM\n * environments).\n */\nexport function createDefaultSessionStorage(): SessionStorage {\n return {\n setItem: (key, value) => {\n sessionStorage.setItem(key, value);\n },\n getItem: (key) => {\n return sessionStorage.getItem(key);\n },\n removeItem: (key) => {\n sessionStorage.removeItem(key);\n },\n };\n}\n","/**\n * Constants whose values are part of the contract between the browser\n * controller and the server-side hubspot-connect routes. Both halves\n * import from this module so the wire format stays in sync.\n */\n\n/**\n * Query parameter on the OAuth return URL that carries the new access\n * token's expiry (Unix epoch milliseconds). The server emits this on\n * the `auth/callback` redirect; the browser parses it during `initSdk`\n * and then strips it from the URL via `history.replaceState`.\n */\nexport const EXPIRES_AT_URL_PARAM = '__hs_expires_at';\n","export { EXPIRES_AT_URL_PARAM } from '../../shared/constants.ts';\n\n/**\n * Key the controller persists the access-token `expiresAt` (Unix\n * epoch milliseconds) under in `sessionStorage`. Survives full-page\n * navigations within the same tab.\n */\nexport const EXPIRES_AT_KEY = 'hubspot_token_expires_at';\n\n/**\n * Number of milliseconds before `expiresAt` that the refresh\n * scheduler attempts to mint a new access token. 60s is comfortably\n * larger than typical network latency without burning lifetime.\n */\nexport const REFRESH_BUFFER_MS = 60_000;\n","import { EXPIRES_AT_KEY } from '../constants.ts';\nimport type { AppConnectContext } from '../types.ts';\n\ninterface StoreExpiresAtOptions {\n context: AppConnectContext;\n expiresAtMs: number;\n}\n\n/**\n * Persists the access-token `expiresAt` (Unix epoch milliseconds) to\n * both the in-memory store and `sessionStorage` so it survives\n * full-page navigations within the same tab.\n */\nexport function storeExpiresAt(options: StoreExpiresAtOptions): void {\n const { context, expiresAtMs } = options;\n context.store.setState({ expiresAt: expiresAtMs });\n context.sessionStorage.setItem(EXPIRES_AT_KEY, String(expiresAtMs));\n}\n\n/**\n * Reads the persisted `expiresAt` from `sessionStorage`. Removes the\n * value (and returns `null`) if it is malformed or already expired,\n * so a stale entry never reactivates a dead session.\n */\nexport function getExpiresAtFromSessionStorage(\n context: AppConnectContext\n): number | null {\n const raw = context.sessionStorage.getItem(EXPIRES_AT_KEY);\n if (!raw) return null;\n const val = parseInt(raw, 10);\n if (isNaN(val)) {\n context.sessionStorage.removeItem(EXPIRES_AT_KEY);\n return null;\n }\n if (Date.now() > val) {\n context.sessionStorage.removeItem(EXPIRES_AT_KEY);\n return null;\n }\n return val;\n}\n\n/**\n * Clears the persisted session-storage state. Called on disconnect.\n */\nexport function clearSessionStorage(context: AppConnectContext): void {\n context.sessionStorage.removeItem(EXPIRES_AT_KEY);\n}\n\n/**\n * Returns `true` when the controller has an `expiresAt` whose value\n * is still in the future. Used both to drive the UI status and to\n * decide whether the refresh scheduler should run.\n */\nexport function isClientSessionActive(context: AppConnectContext): boolean {\n const state = context.store.getSnapshot();\n const expiresAt = state.expiresAt;\n return expiresAt !== null && Date.now() < expiresAt;\n}\n","import type { LogoutResponse } from '../../shared/wire-types.ts';\nimport type { AppConnectContext } from './types.ts';\nimport { clearSessionStorage } from './utils/session-utils.ts';\n\n/**\n * Disconnect flow:\n *\n * 1. Calls the SDK's `auth/logout` route to revoke the upstream token\n * and clear the refresh-token cookie.\n * 2. Clears the local session-storage `expiresAt` entry.\n * 3. Updates the controller state to `disconnected` and navigates the\n * browser to the URL the server returned in `redirect_to`.\n *\n * Errors are caught, logged, and surfaced via the controller's\n * `error` field so the UI can show a retry state.\n */\nexport async function disconnectFromHubSpot(\n context: AppConnectContext\n): Promise<void> {\n const { config, logger, store } = context;\n logger.info('disconnectFromHubSpot: starting');\n store.setState({ error: null, isDisconnectInFlight: true });\n const { hubSpotConnectBaseUrl: appConnectBaseUrl } = config;\n\n try {\n clearSessionStorage(context);\n\n const response = await fetch(`${appConnectBaseUrl}/auth/logout`, {\n method: 'POST',\n credentials: 'include',\n });\n if (!response.ok) {\n throw new Error(`Logout failed: ${response.status}`);\n }\n const { redirect_to: redirectTo } =\n (await response.json()) as LogoutResponse;\n\n store.setState({\n expiresAt: null,\n isSessionConnected: false,\n isDisconnectInFlight: false,\n });\n\n window.location.href = redirectTo;\n logger.info('disconnectFromHubSpot: redirecting');\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Disconnect failed';\n logger.error('disconnectFromHubSpot: failed', err);\n store.setState({\n error: message,\n isDisconnectInFlight: false,\n });\n }\n}\n","import { EXPIRES_AT_KEY, EXPIRES_AT_URL_PARAM } from './constants.ts';\nimport type { AppConnectContext } from './types.ts';\n\n/**\n * Picks up the `__hs_expires_at` parameter the OAuth callback adds to\n * the redirect URL, persists it to the controller, and strips it from\n * the address bar so it's not logged or bookmarked.\n *\n * Called once by `controller.start()`. A no-op when the parameter\n * isn't present (e.g. on every page load other than the OAuth return\n * trip).\n */\nexport async function initAppConnect(\n context: AppConnectContext\n): Promise<void> {\n const params = new URLSearchParams(window.location.search);\n const expiresAtStr = params.get(EXPIRES_AT_URL_PARAM);\n if (!expiresAtStr) return;\n\n const expiresAt = parseInt(expiresAtStr, 10);\n if (isNaN(expiresAt)) return;\n\n params.delete(EXPIRES_AT_URL_PARAM);\n const cleanSearch = params.toString();\n history.replaceState(\n null,\n '',\n cleanSearch\n ? `${window.location.pathname}?${cleanSearch}`\n : window.location.pathname\n );\n\n context.store.setState({ expiresAt });\n context.sessionStorage.setItem(EXPIRES_AT_KEY, String(expiresAt));\n}\n","import type { RefreshTokenResponse } from '../../shared/wire-types.ts';\nimport { REFRESH_BUFFER_MS } from './constants.ts';\nimport type { AppConnectContext } from './types.ts';\nimport {\n isClientSessionActive,\n storeExpiresAt,\n} from './utils/session-utils.ts';\n\n/**\n * Tear-down handle returned by {@link startRefreshScheduler}. Calling\n * `stop()` clears any pending refresh timer and unsubscribes from the\n * store so the controller can be garbage-collected.\n */\nexport interface RefreshSchedulerHandle {\n stop: () => void;\n}\n\nasync function refreshAccessToken(context: AppConnectContext): Promise<void> {\n const { config } = context;\n\n const refreshResponse = await fetch(\n `${config.hubSpotConnectBaseUrl}/auth/refresh`,\n {\n method: 'POST',\n credentials: 'include',\n }\n );\n if (!refreshResponse.ok) {\n throw new Error(`Refresh failed: ${refreshResponse.status}`);\n }\n const { expires_in: expiresInSeconds } =\n (await refreshResponse.json()) as RefreshTokenResponse;\n if (\n typeof expiresInSeconds !== 'number' ||\n !Number.isFinite(expiresInSeconds) ||\n expiresInSeconds <= 0\n ) {\n throw new Error('Refresh response missing or invalid expires_in');\n }\n const expiresAtMs = Date.now() + expiresInSeconds * 1000;\n\n storeExpiresAt({ context, expiresAtMs });\n}\n\n/**\n * Subscribes to store changes and (re)schedules a token refresh\n * whenever `expiresAt` moves. Returns a handle that the caller can\n * use to stop the scheduler when the controller is destroyed.\n */\nexport function startRefreshScheduler(\n context: AppConnectContext\n): RefreshSchedulerHandle {\n const { logger, store } = context;\n\n let refreshTimer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n\n const scheduleRefresh = () => {\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n if (stopped) return;\n\n const state = store.getSnapshot();\n if (!state.isInitComplete || !state.isSessionConnected) {\n return;\n }\n\n const expiresAt = state.expiresAt;\n if (!expiresAt) {\n logger.debug('scheduleRefresh: no expiresAt, skipping');\n return;\n }\n const delayMs = Math.max(0, expiresAt - Date.now() - REFRESH_BUFFER_MS);\n logger.debug(\n 'scheduleRefresh: next refresh in ',\n (delayMs / 1000).toFixed(1),\n 's',\n {\n expiresAt,\n }\n );\n refreshTimer = setTimeout(() => {\n logger.debug('scheduleRefresh: timer fired, refreshing token');\n refreshTimer = null;\n if (stopped) return;\n\n void (async () => {\n try {\n await refreshAccessToken(context);\n if (stopped) return;\n if (isClientSessionActive(context)) {\n logger.info('token refresh: success, session still active');\n } else {\n logger.warn(\n 'token refresh: success but no active session in storage'\n );\n store.setState({ isSessionConnected: false });\n }\n } catch (err) {\n logger.error('token refresh: failed', err);\n if (stopped) return;\n store.setState({ isSessionConnected: false });\n }\n })();\n }, delayMs);\n };\n\n const unsubscribe = store.subscribe(() => {\n scheduleRefresh();\n });\n\n return {\n stop: () => {\n stopped = true;\n unsubscribe();\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n },\n };\n}\n","/**\n * Wraps `fn` so that calls with the same input (compared via\n * `Object.is`) return the previous output without re-invoking `fn`.\n * The cache holds at most one entry, so this is safe to use for\n * derived view-state from a single store snapshot.\n *\n * Used by `getSnapshot` to keep the React state reference stable\n * between unrelated store updates — `useSyncExternalStore` would\n * otherwise re-render every consumer on every change.\n */\nexport function memoizeLast<TInput, TOutput>(\n fn: (input: TInput) => TOutput\n): (input: TInput) => TOutput {\n let lastInput: TInput;\n let lastOutput: TOutput;\n let hasValue = false;\n return (input: TInput): TOutput => {\n if (hasValue && Object.is(lastInput, input)) {\n return lastOutput;\n }\n lastInput = input;\n lastOutput = fn(input);\n hasValue = true;\n return lastOutput;\n };\n}\n","/**\n * Tiny external store used by the controller. Shaped to be compatible\n * with React's `useSyncExternalStore` while remaining usable outside\n * React.\n */\nexport interface Store<TState extends object> {\n /** Returns the current state. The reference changes on every update. */\n getSnapshot: () => Readonly<TState>;\n /**\n * Subscribes to state changes. Returns an unsubscribe function the\n * caller can invoke at teardown.\n */\n subscribe: (onChange: () => void) => () => void;\n /**\n * Merges `update` into the current state. When `update` is a\n * function, it receives the current state and returns a partial.\n * Listeners are only notified when at least one key actually\n * changed (shallow compare).\n */\n setState: (\n update:\n | Partial<TState>\n | ((prev: Readonly<TState>) => Partial<TState> | TState)\n ) => void;\n /** Reads a single key from the current state. */\n get: <K extends keyof TState>(key: K) => TState[K];\n /** Writes a single key. Listeners only fire when the value changes. */\n set: <K extends keyof TState>(key: K, value: TState[K]) => void;\n /**\n * Drops every listener and prevents future `setState`/`set` calls\n * from notifying. Used by `controller.destroy()`.\n */\n destroy: () => void;\n}\n\nfunction shallowEqualState<TState extends object>(\n a: TState,\n b: TState\n): boolean {\n const keys = new Set([\n ...Object.keys(a),\n ...Object.keys(b),\n ] as (keyof TState)[]);\n for (const k of keys) {\n if (!Object.is(a[k], b[k])) {\n return false;\n }\n }\n return true;\n}\n\nfunction mergeState<TState extends object>(\n prev: TState,\n partial: Partial<TState>\n): TState {\n return { ...prev, ...partial } as TState;\n}\n\n/**\n * Creates a new {@link Store}. The store starts with a shallow copy\n * of `initialState`; subsequent mutations never touch the caller's\n * object.\n */\nexport function createStore<TState extends object>(\n initialState: TState\n): Store<TState> {\n let state: TState = { ...initialState };\n const listeners = new Set<() => void>();\n let destroyed = false;\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n getSnapshot() {\n return state as Readonly<TState>;\n },\n subscribe(onChange) {\n listeners.add(onChange);\n return () => {\n listeners.delete(onChange);\n };\n },\n setState(update) {\n if (destroyed) return;\n const patch =\n typeof update === 'function'\n ? update(state as Readonly<TState>)\n : update;\n if (typeof patch !== 'object' || patch == null) {\n return;\n }\n const next = mergeState(state, patch as Partial<TState>);\n if (shallowEqualState(state, next)) {\n return;\n }\n state = next;\n notify();\n },\n get(key) {\n return state[key];\n },\n set(key, value) {\n if (destroyed) return;\n if (Object.is(state[key], value)) {\n return;\n }\n state = { ...state, [key]: value } as TState;\n notify();\n },\n destroy() {\n destroyed = true;\n listeners.clear();\n },\n };\n}\n","import type { AppConnectState, AppConnectStatus } from '../types.ts';\nimport type { AppConnectInternalState } from './types.ts';\n\nconst noop = (): Promise<void> => Promise.resolve();\n\n/**\n * Snapshot returned by `getServerSnapshot` for SSR. Has stable\n * references and inert connect/disconnect actions because actions are\n * meaningless before hydration.\n */\nexport const SERVER_VIEW: AppConnectState = {\n status: 'initializing',\n error: null,\n connectToHubSpot: noop,\n disconnectFromHubSpot: noop,\n};\n\n/**\n * Reduces the boolean lifecycle flags into the user-facing\n * `AppConnectStatus` enum value. The order of checks matters:\n * disconnect-in-flight beats connect-in-flight (a transitional logout\n * shouldn't show a \"connecting\" spinner), and connected beats default.\n */\nexport function getDerivedStatus(\n state: AppConnectInternalState\n): AppConnectStatus {\n const {\n isInitComplete,\n isConnectInFlight,\n isSessionConnected,\n isDisconnectInFlight,\n } = state;\n if (!isInitComplete) {\n return 'initializing';\n }\n if (isDisconnectInFlight) return 'disconnecting';\n if (isConnectInFlight) return 'connecting';\n if (isSessionConnected) return 'connected';\n return 'disconnected';\n}\n","import { noopLogger, type Logger } from '../../shared/logger.ts';\nimport type {\n AppConnectBrowserConfig,\n AppConnectController,\n AppConnectState,\n} from '../types.ts';\nimport { startHubSpotConnection } from './connect-start.ts';\nimport { createDefaultSessionStorage } from './default-session-storage.ts';\nimport { disconnectFromHubSpot as runDisconnectFromHubSpot } from './disconnect.ts';\nimport { initAppConnect } from './init.ts';\nimport { startRefreshScheduler } from './refresh.ts';\nimport type {\n AppConnectContext,\n AppConnectInternalState,\n AppConnectStore,\n} from './types.ts';\nimport { memoizeLast } from './utils/memoize-utils.ts';\nimport {\n getExpiresAtFromSessionStorage,\n isClientSessionActive,\n} from './utils/session-utils.ts';\nimport { createStore } from './utils/store-utils.ts';\nimport { getDerivedStatus, SERVER_VIEW } from './view-state.ts';\n\n/**\n * Options accepted by {@link createAppConnectController}.\n */\nexport interface CreateAppConnectControllerOptions {\n /** Runtime configuration; see {@link AppConnectBrowserConfig}. */\n config: AppConnectBrowserConfig;\n /** Logger the controller uses for status/debug messages. */\n logger?: Logger;\n}\n\n/**\n * Creates an `AppConnectController`. Exactly one controller should be\n * shared by the entire app — the React provider takes the controller\n * as a prop and exposes it via context.\n *\n * The returned controller is inert until `start()` is called: nothing\n * is read from session storage, no refresh timer is scheduled, and no\n * fetches are issued. Tests can construct a controller and inspect\n * its initial snapshot without triggering side effects.\n */\nexport function createAppConnectController(\n options: CreateAppConnectControllerOptions\n): AppConnectController {\n const { config, logger = noopLogger } = options;\n const sessionStorage = createDefaultSessionStorage();\n const store: AppConnectStore = createStore<AppConnectInternalState>({\n isInitComplete: false,\n isConnectInFlight: false,\n isDisconnectInFlight: false,\n isSessionConnected: false,\n error: null,\n expiresAt: null,\n });\n const context: AppConnectContext = {\n config,\n logger,\n sessionStorage,\n store,\n };\n\n store.setState({ expiresAt: getExpiresAtFromSessionStorage(context) });\n\n let hasStarted = false;\n\n const connectToHubSpot = async () => {\n logger.info('connectToHubSpot: starting');\n store.setState({ error: null, isConnectInFlight: true });\n try {\n await startHubSpotConnection(context);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection failed';\n logger.error('connectToHubSpot: failed', err);\n store.setState({ error: message });\n } finally {\n logger.debug(\n 'connectToHubSpot: connect flow step finished (may redirect to HubSpot)'\n );\n store.setState({ isConnectInFlight: false });\n }\n };\n const disconnectFromHubSpot = () => runDisconnectFromHubSpot(context);\n\n const getViewStateMemoized = memoizeLast<\n Readonly<AppConnectInternalState>,\n AppConnectState\n >((storeState) => ({\n status: getDerivedStatus(storeState),\n error: storeState.error,\n connectToHubSpot,\n disconnectFromHubSpot,\n }));\n\n function getSnapshot() {\n return getViewStateMemoized(store.getSnapshot());\n }\n\n return {\n start() {\n if (hasStarted) {\n logger.debug('start skipped (already started)');\n return;\n }\n hasStarted = true;\n startRefreshScheduler(context);\n\n logger.info('start: initSdk (OAuth return handling if applicable)');\n void (async () => {\n try {\n await initAppConnect(context);\n logger.info('initSdk: completed without error');\n } catch (err) {\n logger.error('initSdk: failed', err);\n store.setState({\n error:\n err instanceof Error\n ? err.message\n : 'App Connect initialization failed',\n });\n } finally {\n const sessionActive = isClientSessionActive(context);\n logger.info('start: init complete, session active:', sessionActive);\n store.setState({\n isInitComplete: true,\n isSessionConnected: sessionActive,\n });\n }\n })();\n },\n subscribe: (fn) => store.subscribe(fn),\n getSnapshot,\n getServerSnapshot: () => SERVER_VIEW,\n };\n}\n"],"mappings":"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"}
@@ -1,125 +0,0 @@
1
- import { base64urlDecode } from "../../shared/encoding/base64.js";
2
- import { HUBSPOT_ACCESS_TOKEN_COOKIE_NAME, HUBSPOT_REFRESH_COOKIE_PREFIX, TEMP_COOKIE_OAUTH_STATE, TEMP_COOKIE_PKCE_VERIFIER } from "../../constants.js";
3
- import { parseCookies } from "../../utils/cookie-utils.js";
4
- import { EXPIRES_AT_URL_PARAM } from "../../shared/constants.js";
5
- import { serializeCookie, setResponseCookie } from "../utils/cookie-utils.js";
6
- import { REFRESH_COOKIE_MAX_AGE_SEC } from "./constants.js";
7
- import { buildClientAssertion, buildClientAssertionFormParams, buildClientSecretFormParams, buildTokenEndpointDpopProof, requestOAuthToken } from "./oauth-client.js";
8
- import { buildCimdClientIdUrlFromRequest, buildOAuthRedirectUriFromRequest, clearTempCookie, isPositiveFiniteNumber, isSafeReturnPath } from "./utils.js";
9
- //#region src/server/hono/hubspot-connect-routes/auth-callback.ts
10
- async function handleAuthCallback(c, options) {
11
- const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv } = options;
12
- const xForwardedProto = c.req.header("x-forwarded-proto") ?? void 0;
13
- const xForwardedHost = c.req.header("x-forwarded-host") ?? void 0;
14
- const requestHostHeader = c.req.header("host") ?? void 0;
15
- const code = c.req.query("code");
16
- const state = c.req.query("state");
17
- if (!code || !state) return c.text("Missing code or state", 400);
18
- if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) return c.text("Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled", 500);
19
- const cookies = parseCookies(c.req.header("Cookie"));
20
- const expectedState = cookies[TEMP_COOKIE_OAUTH_STATE];
21
- const codeVerifier = cookies[TEMP_COOKIE_PKCE_VERIFIER];
22
- if (!expectedState || state !== decodeURIComponent(expectedState)) return c.text("State mismatch", 403);
23
- if (!codeVerifier) return c.text("Missing PKCE verifier", 400);
24
- let statePayload;
25
- try {
26
- statePayload = JSON.parse(new TextDecoder().decode(base64urlDecode(decodeURIComponent(state))));
27
- } catch {
28
- return c.text("Malformed state value", 400);
29
- }
30
- const returnPath = statePayload.return_path;
31
- if (!returnPath || !isSafeReturnPath(returnPath)) return c.text("Invalid return path in state", 400);
32
- const sessionId = statePayload.sid;
33
- if (!sessionId) return c.text("Missing app session cookie", 400);
34
- const decodedCodeVerifier = decodeURIComponent(codeVerifier);
35
- const clientId = hubspotConnectEnv.isCimdEnabled ? buildCimdClientIdUrlFromRequest({
36
- requestUrl: c.req.url,
37
- basePath,
38
- xForwardedProto,
39
- xForwardedHost,
40
- requestHostHeader
41
- }) : hubspotConnectEnv.hubspotClientId;
42
- const redirectUri = buildOAuthRedirectUriFromRequest({
43
- requestUrl: c.req.url,
44
- basePath,
45
- xForwardedProto,
46
- xForwardedHost,
47
- requestHostHeader
48
- });
49
- const tokenEndpointUrl = new URL("/oauth/v1/token", hubspotConnectEnv.hubspotOAuthApiOrigin).href;
50
- let dpopProof;
51
- if (hubspotConnectEnv.isDpopEnabled) dpopProof = await buildTokenEndpointDpopProof({
52
- appKeys,
53
- tokenEndpointUrl,
54
- sessionIdHash: sessionId
55
- });
56
- let formParams;
57
- if (hubspotConnectEnv.isCimdEnabled) formParams = {
58
- grant_type: "authorization_code",
59
- code,
60
- code_verifier: decodedCodeVerifier,
61
- redirect_uri: redirectUri,
62
- ...buildClientAssertionFormParams({
63
- clientId,
64
- clientAssertion: await buildClientAssertion({
65
- appKeys,
66
- clientId,
67
- audience: tokenEndpointUrl
68
- })
69
- })
70
- };
71
- else formParams = {
72
- grant_type: "authorization_code",
73
- code,
74
- code_verifier: decodedCodeVerifier,
75
- redirect_uri: redirectUri,
76
- ...buildClientSecretFormParams({
77
- clientId,
78
- clientSecret: hubspotConnectEnv.hubspotClientSecret
79
- })
80
- };
81
- const tokenResult = await requestOAuthToken({
82
- tokenEndpointUrl,
83
- isDpopEnabled: hubspotConnectEnv.isDpopEnabled,
84
- ...dpopProof !== void 0 ? { dpopProof } : {},
85
- formParams
86
- });
87
- if (!tokenResult.ok) return c.text(`Token exchange failed: ${tokenResult.errorText}`, 502);
88
- const { access_token: accessToken, refresh_token: refreshToken, expires_in } = tokenResult.body;
89
- if (!refreshToken) return c.text("Token response missing refresh_token", 502);
90
- if (!isPositiveFiniteNumber(expires_in)) return c.text("Token response missing or invalid expires_in", 502);
91
- const expiresAt = Date.now() + expires_in * 1e3;
92
- const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sessionId}`;
93
- setResponseCookie({
94
- c,
95
- value: serializeCookie({
96
- name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,
97
- value: accessToken,
98
- path: "/",
99
- maxAge: expires_in
100
- })
101
- });
102
- setResponseCookie({
103
- c,
104
- value: serializeCookie({
105
- name: refreshCookieName,
106
- value: refreshToken,
107
- path: refreshCookiePath,
108
- maxAge: REFRESH_COOKIE_MAX_AGE_SEC
109
- })
110
- });
111
- setResponseCookie({
112
- c,
113
- value: clearTempCookie(TEMP_COOKIE_PKCE_VERIFIER)
114
- });
115
- setResponseCookie({
116
- c,
117
- value: clearTempCookie(TEMP_COOKIE_OAUTH_STATE)
118
- });
119
- const separator = returnPath.includes("?") ? "&" : "?";
120
- return c.redirect(`${returnPath}${separator}${EXPIRES_AT_URL_PARAM}=${expiresAt}`, 302);
121
- }
122
- //#endregion
123
- export { handleAuthCallback };
124
-
125
- //# sourceMappingURL=auth-callback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-callback.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-callback.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport { EXPIRES_AT_URL_PARAM } from '../../../shared/constants.ts';\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_REFRESH_COOKIE_PREFIX,\n TEMP_COOKIE_OAUTH_STATE,\n TEMP_COOKIE_PKCE_VERIFIER,\n} from '../../constants.ts';\nimport { base64urlDecode } from '../../utils/base64-utils.ts';\nimport { parseCookies } from '../../utils/cookie-utils.ts';\nimport { serializeCookie, setResponseCookie } from '../utils/cookie-utils.ts';\nimport { REFRESH_COOKIE_MAX_AGE_SEC } from './constants.ts';\nimport {\n buildClientAssertion,\n buildClientAssertionFormParams,\n buildClientSecretFormParams,\n buildTokenEndpointDpopProof,\n requestOAuthToken,\n} from './oauth-client.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildCimdClientIdUrlFromRequest,\n buildOAuthRedirectUriFromRequest,\n clearTempCookie,\n isPositiveFiniteNumber,\n isSafeReturnPath,\n} from './utils.ts';\n\ninterface OAuthStatePayload {\n return_path?: string;\n sid?: string;\n}\n\nexport async function handleAuthCallback(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv } = options;\n const xForwardedProto = c.req.header('x-forwarded-proto') ?? undefined;\n const xForwardedHost = c.req.header('x-forwarded-host') ?? undefined;\n const requestHostHeader = c.req.header('host') ?? undefined;\n const code = c.req.query('code');\n const state = c.req.query('state');\n\n if (!code || !state) {\n return c.text('Missing code or state', 400);\n }\n\n if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) {\n return c.text(\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled',\n 500\n );\n }\n\n const cookies = parseCookies(c.req.header('Cookie'));\n const expectedState = cookies[TEMP_COOKIE_OAUTH_STATE];\n const codeVerifier = cookies[TEMP_COOKIE_PKCE_VERIFIER];\n\n if (!expectedState || state !== decodeURIComponent(expectedState)) {\n return c.text('State mismatch', 403);\n }\n if (!codeVerifier) {\n return c.text('Missing PKCE verifier', 400);\n }\n\n let statePayload: OAuthStatePayload;\n try {\n statePayload = JSON.parse(\n new TextDecoder().decode(base64urlDecode(decodeURIComponent(state)))\n ) as OAuthStatePayload;\n } catch {\n return c.text('Malformed state value', 400);\n }\n const returnPath = statePayload.return_path;\n if (!returnPath || !isSafeReturnPath(returnPath)) {\n return c.text('Invalid return path in state', 400);\n }\n\n const sessionId = statePayload.sid;\n if (!sessionId) {\n return c.text('Missing app session cookie', 400);\n }\n\n const decodedCodeVerifier = decodeURIComponent(codeVerifier);\n\n const clientId = hubspotConnectEnv.isCimdEnabled\n ? buildCimdClientIdUrlFromRequest({\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n })\n : hubspotConnectEnv.hubspotClientId;\n\n const redirectUri = buildOAuthRedirectUriFromRequest({\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n });\n\n const tokenEndpointUrl = new URL(\n '/oauth/v1/token',\n hubspotConnectEnv.hubspotOAuthApiOrigin\n ).href;\n\n let dpopProof: string | undefined;\n if (hubspotConnectEnv.isDpopEnabled) {\n dpopProof = await buildTokenEndpointDpopProof({\n appKeys: appKeys!,\n tokenEndpointUrl,\n sessionIdHash: sessionId,\n });\n }\n\n let formParams: Record<string, string>;\n if (hubspotConnectEnv.isCimdEnabled) {\n const clientAssertion = await buildClientAssertion({\n appKeys: appKeys!,\n clientId,\n audience: tokenEndpointUrl,\n });\n formParams = {\n grant_type: 'authorization_code',\n code,\n code_verifier: decodedCodeVerifier,\n redirect_uri: redirectUri,\n ...buildClientAssertionFormParams({ clientId, clientAssertion }),\n };\n } else {\n formParams = {\n grant_type: 'authorization_code',\n code,\n code_verifier: decodedCodeVerifier,\n redirect_uri: redirectUri,\n ...buildClientSecretFormParams({\n clientId,\n clientSecret: hubspotConnectEnv.hubspotClientSecret,\n }),\n };\n }\n\n const tokenResult = await requestOAuthToken({\n tokenEndpointUrl,\n isDpopEnabled: hubspotConnectEnv.isDpopEnabled,\n ...(dpopProof !== undefined ? { dpopProof } : {}),\n formParams,\n });\n if (!tokenResult.ok) {\n return c.text(`Token exchange failed: ${tokenResult.errorText}`, 502);\n }\n\n const {\n access_token: accessToken,\n refresh_token: refreshToken,\n expires_in,\n } = tokenResult.body;\n if (!refreshToken) {\n return c.text('Token response missing refresh_token', 502);\n }\n if (!isPositiveFiniteNumber(expires_in)) {\n return c.text('Token response missing or invalid expires_in', 502);\n }\n\n const expiresAt = Date.now() + expires_in * 1000;\n const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sessionId}`;\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n value: accessToken,\n path: '/',\n maxAge: expires_in,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: refreshCookieName,\n value: refreshToken,\n path: refreshCookiePath,\n maxAge: REFRESH_COOKIE_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({ c, value: clearTempCookie(TEMP_COOKIE_PKCE_VERIFIER) });\n setResponseCookie({ c, value: clearTempCookie(TEMP_COOKIE_OAUTH_STATE) });\n\n const separator = returnPath.includes('?') ? '&' : '?';\n return c.redirect(\n `${returnPath}${separator}${EXPIRES_AT_URL_PARAM}=${expiresAt}`,\n 302\n );\n}\n"],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- import { signDpopProof } from "./utils/dpop-utils.js";
2
- import { sha256base64url } from "./shared/encoding/sha256.js";
3
- import { isHubspotDpopEnabled, requireEnv } from "./utils/env-utils.js";
4
- import { noopLogger } from "./shared/logger.js";
5
- //#region src/server/proxy.ts
6
- const HUBSPOT_API_ORIGIN = requireEnv("HUBSPOT_API_ORIGIN");
7
- const notAuthenticated = {
8
- authenticated: false,
9
- fetch: async () => {
10
- return new Response(null, {
11
- status: 401,
12
- statusText: "Unauthorized",
13
- headers: { "Content-Type": "application/json" }
14
- });
15
- }
16
- };
17
- const EMPTY_HEADERS = {};
18
- function createHubSpotProxy(options) {
19
- const { userCredentials, appKeys, logger = noopLogger } = options;
20
- if (isHubspotDpopEnabled() && appKeys === null) throw new Error("createHubSpotProxy: appKeys is required when HUBSPOT_DPOP_ENABLED is not false");
21
- const { accessToken, sessionId } = userCredentials;
22
- if (!accessToken || !sessionId) {
23
- logger.debug("createHubSpotProxy: returning unauthenticated proxy (missing cookies)");
24
- return notAuthenticated;
25
- }
26
- async function proxyFetch(request) {
27
- const { path, method = "GET", headers = EMPTY_HEADERS, body } = request;
28
- const targetUrl = `${HUBSPOT_API_ORIGIN}${path}`;
29
- const useDpop = isHubspotDpopEnabled();
30
- let authorizationHeaders;
31
- if (useDpop) {
32
- const ath = await sha256base64url(accessToken);
33
- const sid = await sha256base64url(sessionId);
34
- const dpopProof = await signDpopProof({
35
- appKeys,
36
- claims: {
37
- htm: method,
38
- htu: targetUrl,
39
- jti: crypto.randomUUID(),
40
- iat: Math.floor(Date.now() / 1e3),
41
- ath,
42
- sid
43
- }
44
- });
45
- authorizationHeaders = {
46
- Authorization: `DPoP ${accessToken}`,
47
- DPoP: dpopProof
48
- };
49
- } else authorizationHeaders = { Authorization: `Bearer ${accessToken}` };
50
- const requestInit = {
51
- headers: {
52
- ...headers,
53
- ...authorizationHeaders
54
- },
55
- method
56
- };
57
- if (body != null) requestInit.body = body;
58
- return fetch(targetUrl, requestInit);
59
- }
60
- return {
61
- authenticated: true,
62
- fetch: proxyFetch
63
- };
64
- }
65
- //#endregion
66
- export { createHubSpotProxy };
67
-
68
- //# sourceMappingURL=proxy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["import { noopLogger, type Logger } from '../shared/logger.ts';\nimport {\n type AppKeys,\n type HubSpotProxy,\n type HubSpotProxyRequest,\n type UserCredentials,\n} from './types.ts';\nimport { sha256base64url } from './utils/crypto-utils.ts';\nimport { signDpopProof } from './utils/dpop-utils.ts';\nimport { isHubspotDpopEnabled, requireEnv } from './utils/env-utils.ts';\n\nconst HUBSPOT_API_ORIGIN = requireEnv('HUBSPOT_API_ORIGIN');\n\n/**\n * Options accepted by {@link createHubSpotProxy}.\n */\nexport interface CreateHubSpotProxyOptions {\n /**\n * User session context from the incoming browser request.\n */\n userCredentials: UserCredentials;\n\n /**\n * Imported app keys from `secureStart`, or `null` when CIMD and DPoP\n * are both disabled.\n */\n appKeys: AppKeys | null;\n /** Optional logger. Defaults to a no-op logger. */\n logger?: Logger;\n}\n\nconst notAuthenticated: HubSpotProxy = {\n authenticated: false,\n fetch: async (): Promise<Response> => {\n return new Response(null, {\n status: 401,\n statusText: 'Unauthorized',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n },\n};\n\nconst EMPTY_HEADERS = {};\n\nexport function createHubSpotProxy(\n options: CreateHubSpotProxyOptions\n): HubSpotProxy {\n const { userCredentials, appKeys, logger = noopLogger } = options;\n\n if (isHubspotDpopEnabled() && appKeys === null) {\n throw new Error(\n 'createHubSpotProxy: appKeys is required when HUBSPOT_DPOP_ENABLED is not false'\n );\n }\n\n const { accessToken, sessionId } = userCredentials;\n\n if (!accessToken || !sessionId) {\n logger.debug(\n 'createHubSpotProxy: returning unauthenticated proxy (missing cookies)'\n );\n return notAuthenticated;\n }\n\n async function proxyFetch(request: HubSpotProxyRequest): Promise<Response> {\n const { path, method = 'GET', headers = EMPTY_HEADERS, body } = request;\n\n const targetUrl = `${HUBSPOT_API_ORIGIN}${path}`;\n const useDpop = isHubspotDpopEnabled();\n\n let authorizationHeaders: Record<string, string>;\n if (useDpop) {\n const ath = await sha256base64url(accessToken!);\n const sid = await sha256base64url(sessionId!);\n const dpopProof = await signDpopProof({\n appKeys: appKeys!,\n claims: {\n htm: method,\n htu: targetUrl,\n jti: crypto.randomUUID(),\n iat: Math.floor(Date.now() / 1000),\n ath,\n sid,\n },\n });\n authorizationHeaders = {\n Authorization: `DPoP ${accessToken}`,\n DPoP: dpopProof,\n };\n } else {\n authorizationHeaders = {\n Authorization: `Bearer ${accessToken}`,\n };\n }\n\n const finalHeaders = { ...headers, ...authorizationHeaders };\n\n const requestInit: RequestInit = {\n headers: finalHeaders,\n method,\n };\n\n if (body != null) {\n requestInit.body = body;\n }\n\n return fetch(targetUrl, requestInit);\n }\n\n return {\n authenticated: true,\n fetch: proxyFetch,\n };\n}\n"],"mappings":";;;;;AAWA,MAAM,qBAAqB,WAAW,qBAAqB;AAoB3D,MAAM,mBAAiC;CACrC,eAAe;CACf,OAAO,YAA+B;EACpC,OAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,YAAY;GACZ,SAAS,EACP,gBAAgB,oBACjB;GACF,CAAC;;CAEL;AAED,MAAM,gBAAgB,EAAE;AAExB,SAAgB,mBACd,SACc;CACd,MAAM,EAAE,iBAAiB,SAAS,SAAS,eAAe;CAE1D,IAAI,sBAAsB,IAAI,YAAY,MACxC,MAAM,IAAI,MACR,iFACD;CAGH,MAAM,EAAE,aAAa,cAAc;CAEnC,IAAI,CAAC,eAAe,CAAC,WAAW;EAC9B,OAAO,MACL,wEACD;EACD,OAAO;;CAGT,eAAe,WAAW,SAAiD;EACzE,MAAM,EAAE,MAAM,SAAS,OAAO,UAAU,eAAe,SAAS;EAEhE,MAAM,YAAY,GAAG,qBAAqB;EAC1C,MAAM,UAAU,sBAAsB;EAEtC,IAAI;EACJ,IAAI,SAAS;GACX,MAAM,MAAM,MAAM,gBAAgB,YAAa;GAC/C,MAAM,MAAM,MAAM,gBAAgB,UAAW;GAC7C,MAAM,YAAY,MAAM,cAAc;IAC3B;IACT,QAAQ;KACN,KAAK;KACL,KAAK;KACL,KAAK,OAAO,YAAY;KACxB,KAAK,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;KAClC;KACA;KACD;IACF,CAAC;GACF,uBAAuB;IACrB,eAAe,QAAQ;IACvB,MAAM;IACP;SAED,uBAAuB,EACrB,eAAe,UAAU,eAC1B;EAKH,MAAM,cAA2B;GAC/B,SAAS;IAHY,GAAG;IAAS,GAAG;IAGf;GACrB;GACD;EAED,IAAI,QAAQ,MACV,YAAY,OAAO;EAGrB,OAAO,MAAM,WAAW,YAAY;;CAGtC,OAAO;EACL,eAAe;EACf,OAAO;EACR"}