@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-complete.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-complete.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport {\n AUTH_COMPLETE_CODE_PARAM,\n AUTH_COMPLETE_STATE_PARAM,\n} from '../../../shared/constants.ts';\nimport type { AuthCompleteResponse } from '../../../shared/wire-types.ts';\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_APP_ORIGIN_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 buildFrontendOAuthRedirectUri,\n clearTempCookie,\n isPositiveFiniteNumber,\n isSafeReturnPath,\n parseAppOriginHeader,\n} from './utils.ts';\nimport { fetchWhoami } from './whoami.ts';\n\ninterface OAuthStatePayload {\n return_path?: string;\n sid?: string;\n}\n\n/**\n * Cross-origin OAuth completion endpoint.\n *\n * Called from the React app on the frontend OAuth callback path\n * (`HUBSPOT_FRONTEND_CALLBACK_PATH`) once HubSpot has redirected the\n * browser back with `?code` + `?state`. The browser POSTs both\n * values here as a credentialed cross-site fetch — same partition as\n * `init-session`, so the temp PKCE/state cookies are visible — and\n * the SDK:\n *\n * 1. Validates `state` against the temp `__hs_oauth_state` cookie.\n * 2. Pulls the PKCE verifier from `__hs_pkce_verifier`.\n * 3. Rebuilds the same `redirect_uri` it sent to HubSpot during\n * `init-session` (frontend origin + the fixed callback path);\n * the OAuth token endpoint requires the two values to match.\n * 4. Exchanges `code` for an access + refresh token (with DPoP /\n * CIMD client-assertion when enabled).\n * 5. Sets the durable session cookies (access token, refresh) with\n * `SameSite=None; Secure; Partitioned` so they live in the\n * `(frontend, edge)` partition where subsequent API fetches will\n * read them.\n * 6. Clears the temp cookies.\n * 7. Returns `{ expires_at, return_path }` so the controller can\n * update its session-storage expiry tracking and navigate back to\n * the page the user started the connect flow from.\n */\nexport async function handleAuthComplete(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { appKeys, refreshCookiePath, 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(AUTH_COMPLETE_CODE_PARAM);\n const state = c.req.query(AUTH_COMPLETE_STATE_PARAM);\n\n if (!code || !state) {\n return c.json({ error: 'Missing code or state' }, 400);\n }\n\n if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) {\n return c.json(\n {\n error:\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled',\n },\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 const appOriginCookie = cookies[HUBSPOT_APP_ORIGIN_COOKIE_NAME];\n\n if (!expectedState || state !== decodeURIComponent(expectedState)) {\n return c.json({ error: 'State mismatch' }, 403);\n }\n if (!codeVerifier) {\n return c.json({ error: 'Missing PKCE verifier' }, 400);\n }\n // The redirect_uri the OAuth token endpoint validates must equal\n // the one we sent during init-session. We rebuild it from the\n // pinned origin cookie so that value is anchored server-side, not\n // taken from the (caller-controlled) request `Origin` on this call.\n const appOrigin = parseAppOriginHeader(appOriginCookie);\n if (!appOrigin) {\n return c.json({ error: 'Missing app origin cookie' }, 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.json({ error: 'Malformed state value' }, 400);\n }\n const returnPath = statePayload.return_path;\n if (!returnPath || !isSafeReturnPath(returnPath)) {\n return c.json({ error: 'Invalid return path in state' }, 400);\n }\n\n const sessionId = statePayload.sid;\n if (!sessionId) {\n return c.json({ error: '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: options.basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n appOrigin,\n })\n : hubspotConnectEnv.hubspotClientId;\n\n const redirectUri = buildFrontendOAuthRedirectUri(appOrigin);\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.json(\n { error: `Token exchange failed: ${tokenResult.errorText}` },\n 502\n );\n }\n\n const {\n access_token: accessToken,\n refresh_token: refreshToken,\n expires_in,\n } = tokenResult.body;\n if (!refreshToken) {\n return c.json({ error: 'Token response missing refresh_token' }, 502);\n }\n if (!isPositiveFiniteNumber(expires_in)) {\n return c.json(\n { error: 'Token response missing or invalid expires_in' },\n 502\n );\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 sameSite: 'None',\n partitioned: true,\n maxAge: expires_in,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: refreshCookieName,\n value: refreshToken,\n path: refreshCookiePath,\n sameSite: 'None',\n partitioned: true,\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 whoami = await fetchWhoami(accessToken, hubspotConnectEnv);\n return c.json({\n expires_at: expiresAt,\n return_path: returnPath,\n whoami,\n } satisfies AuthCompleteResponse);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmEA,eAAsB,mBACpB,GACA,SACA;CACA,MAAM,EAAE,SAAS,mBAAmB,sBAAsB;CAC1D,MAAM,kBAAkB,EAAE,IAAI,OAAO,mBAAmB,KAAK,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,kBAAkB,KAAK,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,MAAM,KAAK,KAAA;CAClD,MAAM,OAAO,EAAE,IAAI,MAAM,wBAAwB;CACjD,MAAM,QAAQ,EAAE,IAAI,MAAM,yBAAyB;CAEnD,IAAI,CAAC,QAAQ,CAAC,OACZ,OAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;CAGvD,IAAI,kBAAkB,2BAA2B,CAAC,SAChD,OAAO,EAAE,KACP,EACE,OACE,4FACJ,GACA,GACF;CAGF,MAAM,UAAU,aAAa,EAAE,IAAI,OAAO,QAAQ,CAAC;CACnD,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,eAAe,QAAQ;CAC7B,MAAM,kBAAkB,QAAQ;CAEhC,IAAI,CAAC,iBAAiB,UAAU,mBAAmB,aAAa,GAC9D,OAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;CAEhD,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;CAMvD,MAAM,YAAY,qBAAqB,eAAe;CACtD,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,4BAA4B,GAAG,GAAG;CAG3D,IAAI;CACJ,IAAI;EACF,eAAe,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,gBAAgB,mBAAmB,KAAK,CAAC,CAAC,CACrE;CACF,QAAQ;EACN,OAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;CACvD;CACA,MAAM,aAAa,aAAa;CAChC,IAAI,CAAC,cAAc,CAAC,iBAAiB,UAAU,GAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,+BAA+B,GAAG,GAAG;CAG9D,MAAM,YAAY,aAAa;CAC/B,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,6BAA6B,GAAG,GAAG;CAG5D,MAAM,sBAAsB,mBAAmB,YAAY;CAE3D,MAAM,WAAW,kBAAkB,gBAC/B,gCAAgC;EAC9B,YAAY,EAAE,IAAI;EAClB,UAAU,QAAQ;EAClB;EACA;EACA;EACA;CACF,CAAC,IACD,kBAAkB;CAEtB,MAAM,cAAc,8BAA8B,SAAS;CAE3D,MAAM,mBAAmB,IAAI,IAC3B,mBACA,kBAAkB,qBACpB,EAAE;CAEF,IAAI;CACJ,IAAI,kBAAkB,eACpB,YAAY,MAAM,4BAA4B;EACnC;EACT;EACA,eAAe;CACjB,CAAC;CAGH,IAAI;CACJ,IAAI,kBAAkB,eAMpB,aAAa;EACX,YAAY;EACZ;EACA,eAAe;EACf,cAAc;EACd,GAAG,+BAA+B;GAAE;GAAU,iBAAA,MAVlB,qBAAqB;IACxC;IACT;IACA,UAAU;GACZ,CAAC;EAM+D,CAAC;CACjE;MAEA,aAAa;EACX,YAAY;EACZ;EACA,eAAe;EACf,cAAc;EACd,GAAG,4BAA4B;GAC7B;GACA,cAAc,kBAAkB;EAClC,CAAC;CACH;CAGF,MAAM,cAAc,MAAM,kBAAkB;EAC1C;EACA,eAAe,kBAAkB;EACjC,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;EAC/C;CACF,CAAC;CACD,IAAI,CAAC,YAAY,IACf,OAAO,EAAE,KACP,EAAE,OAAO,0BAA0B,YAAY,YAAY,GAC3D,GACF;CAGF,MAAM,EACJ,cAAc,aACd,eAAe,cACf,eACE,YAAY;CAChB,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,uCAAuC,GAAG,GAAG;CAEtE,IAAI,CAAC,uBAAuB,UAAU,GACpC,OAAO,EAAE,KACP,EAAE,OAAO,+CAA+C,GACxD,GACF;CAGF,MAAM,YAAY,KAAK,IAAI,IAAI,aAAa;CAC5C,MAAM,oBAAoB,GAAG,gCAAgC;CAE7D,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAAE;EAAG,OAAO,gBAAgB,yBAAyB;CAAE,CAAC;CAC1E,kBAAkB;EAAE;EAAG,OAAO,gBAAgB,uBAAuB;CAAE,CAAC;CAExE,MAAM,SAAS,MAAM,YAAY,aAAa,iBAAiB;CAC/D,OAAO,EAAE,KAAK;EACZ,YAAY;EACZ,aAAa;EACb;CACF,CAAgC;AAClC"}
@@ -1,9 +1,9 @@
1
1
  import { base64url } from "../../shared/encoding/base64.js";
2
2
  import { sha256base64url } from "../../shared/encoding/sha256.js";
3
- import { HUBSPOT_APP_SID_COOKIE_NAME, TEMP_COOKIE_OAUTH_STATE, TEMP_COOKIE_PKCE_VERIFIER } from "../../constants.js";
3
+ import { HUBSPOT_APP_ORIGIN_COOKIE_NAME, HUBSPOT_APP_SID_COOKIE_NAME, TEMP_COOKIE_OAUTH_STATE, TEMP_COOKIE_PKCE_VERIFIER } from "../../constants.js";
4
4
  import { serializeCookie, setResponseCookie } from "../utils/cookie-utils.js";
5
5
  import { OAUTH_TEMP_MAX_AGE_SEC, SESSION_MAX_AGE_SEC } from "./constants.js";
6
- import { buildCimdClientIdUrlFromRequest, buildOAuthRedirectUriFromRequest, isSafeReturnPath } from "./utils.js";
6
+ import { buildCimdClientIdUrlFromRequest, buildFrontendOAuthRedirectUri, isSafeReturnPath, parseAppOriginHeader } from "./utils.js";
7
7
  import { deriveHubSpotAuthorizeScopesFromClientMetadata } from "./fetch-hubspot-client-metadata.js";
8
8
  //#region src/server/hono/hubspot-connect-routes/auth-init-session.ts
9
9
  async function handleAuthInitSession(c, options) {
@@ -13,6 +13,8 @@ async function handleAuthInitSession(c, options) {
13
13
  const requestHostHeader = c.req.header("host") ?? void 0;
14
14
  const returnPath = new URL(c.req.url).searchParams.get("return_path") ?? "/";
15
15
  if (!isSafeReturnPath(returnPath)) return c.text("Invalid return_path", 400);
16
+ const appOrigin = parseAppOriginHeader(c.req.header("Origin"));
17
+ if (!appOrigin) return c.text("Missing or invalid Origin header; init-session must be called from a browser", 400);
16
18
  const sessionIdBytes = new Uint8Array(32);
17
19
  crypto.getRandomValues(sessionIdBytes);
18
20
  const sessionId = base64url(sessionIdBytes);
@@ -30,15 +32,11 @@ async function handleAuthInitSession(c, options) {
30
32
  basePath: options.basePath,
31
33
  xForwardedProto,
32
34
  xForwardedHost,
33
- requestHostHeader
35
+ requestHostHeader,
36
+ appOrigin
34
37
  }) : hubspotConnectEnv.hubspotClientId;
35
- const redirectUri = buildOAuthRedirectUriFromRequest({
36
- requestUrl: c.req.url,
37
- basePath: options.basePath,
38
- xForwardedProto,
39
- xForwardedHost,
40
- requestHostHeader
41
- });
38
+ console.log("clientId", clientId);
39
+ const redirectUri = buildFrontendOAuthRedirectUri(appOrigin);
42
40
  const authorizeUrl = new URL(hubspotConnectEnv.hubspotAuthorizationEndpoint);
43
41
  authorizeUrl.searchParams.set("response_type", "code");
44
42
  authorizeUrl.searchParams.set("client_id", clientId);
@@ -53,12 +51,25 @@ async function handleAuthInitSession(c, options) {
53
51
  authorizeUrl.searchParams.set("scope", scopesResult.scope);
54
52
  if (scopesResult.optionalScope !== void 0) authorizeUrl.searchParams.set("optional_scope", scopesResult.optionalScope);
55
53
  }
54
+ setResponseCookie({
55
+ c,
56
+ value: serializeCookie({
57
+ name: HUBSPOT_APP_ORIGIN_COOKIE_NAME,
58
+ value: appOrigin,
59
+ path: "/",
60
+ sameSite: "None",
61
+ partitioned: true,
62
+ maxAge: SESSION_MAX_AGE_SEC
63
+ })
64
+ });
56
65
  setResponseCookie({
57
66
  c,
58
67
  value: serializeCookie({
59
68
  name: HUBSPOT_APP_SID_COOKIE_NAME,
60
69
  value: sessionId,
61
70
  path: "/",
71
+ sameSite: "None",
72
+ partitioned: true,
62
73
  maxAge: SESSION_MAX_AGE_SEC
63
74
  })
64
75
  });
@@ -68,7 +79,8 @@ async function handleAuthInitSession(c, options) {
68
79
  name: TEMP_COOKIE_PKCE_VERIFIER,
69
80
  value: encodeURIComponent(codeVerifier),
70
81
  path: "/",
71
- sameSite: "Lax",
82
+ sameSite: "None",
83
+ partitioned: true,
72
84
  maxAge: OAUTH_TEMP_MAX_AGE_SEC
73
85
  })
74
86
  });
@@ -78,7 +90,8 @@ async function handleAuthInitSession(c, options) {
78
90
  name: TEMP_COOKIE_OAUTH_STATE,
79
91
  value: encodeURIComponent(stateValue),
80
92
  path: "/",
81
- sameSite: "Lax",
93
+ sameSite: "None",
94
+ partitioned: true,
82
95
  maxAge: OAUTH_TEMP_MAX_AGE_SEC
83
96
  })
84
97
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auth-init-session.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-init-session.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport {\n HUBSPOT_APP_SID_COOKIE_NAME,\n TEMP_COOKIE_OAUTH_STATE,\n TEMP_COOKIE_PKCE_VERIFIER,\n} from '../../constants.ts';\nimport { base64url } from '../../utils/base64-utils.ts';\nimport { sha256base64url } from '../../utils/crypto-utils.ts';\nimport { serializeCookie, setResponseCookie } from '../utils/cookie-utils.ts';\nimport { OAUTH_TEMP_MAX_AGE_SEC, SESSION_MAX_AGE_SEC } from './constants.ts';\nimport { deriveHubSpotAuthorizeScopesFromClientMetadata } from './fetch-hubspot-client-metadata.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildCimdClientIdUrlFromRequest,\n buildOAuthRedirectUriFromRequest,\n isSafeReturnPath,\n} from './utils.ts';\n\nexport async function handleAuthInitSession(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { hubspotConnectEnv, cimdClientMetadata } = 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 url = new URL(c.req.url);\n const returnPath = url.searchParams.get('return_path') ?? '/';\n if (!isSafeReturnPath(returnPath)) {\n return c.text('Invalid return_path', 400);\n }\n\n const sessionIdBytes = new Uint8Array(32);\n crypto.getRandomValues(sessionIdBytes);\n const sessionId = base64url(sessionIdBytes);\n const sessionIdHash = await sha256base64url(sessionId);\n\n const codeVerifierBytes = new Uint8Array(32);\n crypto.getRandomValues(codeVerifierBytes);\n const codeVerifier = base64url(codeVerifierBytes);\n const codeChallenge = await sha256base64url(codeVerifier);\n\n const stateValue = base64url(\n new TextEncoder().encode(\n JSON.stringify({\n return_path: returnPath,\n sid: sessionIdHash,\n })\n )\n );\n\n const clientId = hubspotConnectEnv.isCimdEnabled\n ? buildCimdClientIdUrlFromRequest({\n requestUrl: c.req.url,\n basePath: options.basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n })\n : hubspotConnectEnv.hubspotClientId;\n\n const redirectUri = buildOAuthRedirectUriFromRequest({\n requestUrl: c.req.url,\n basePath: options.basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n });\n\n const authorizeUrl = new URL(hubspotConnectEnv.hubspotAuthorizationEndpoint);\n authorizeUrl.searchParams.set('response_type', 'code');\n authorizeUrl.searchParams.set('client_id', clientId);\n authorizeUrl.searchParams.set('redirect_uri', redirectUri);\n authorizeUrl.searchParams.set('code_challenge', codeChallenge);\n authorizeUrl.searchParams.set('code_challenge_method', 'S256');\n authorizeUrl.searchParams.set('state', stateValue);\n authorizeUrl.searchParams.set('sid', sessionIdHash);\n\n if (!hubspotConnectEnv.isCimdEnabled) {\n const scopesResult =\n deriveHubSpotAuthorizeScopesFromClientMetadata(cimdClientMetadata);\n if (!scopesResult.ok) {\n return c.text(scopesResult.message, scopesResult.status as 500 | 502);\n }\n authorizeUrl.searchParams.set('scope', scopesResult.scope);\n if (scopesResult.optionalScope !== undefined) {\n authorizeUrl.searchParams.set(\n 'optional_scope',\n scopesResult.optionalScope\n );\n }\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_SID_COOKIE_NAME,\n value: sessionId,\n path: '/',\n maxAge: SESSION_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: TEMP_COOKIE_PKCE_VERIFIER,\n value: encodeURIComponent(codeVerifier),\n path: '/',\n sameSite: 'Lax',\n maxAge: OAUTH_TEMP_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: TEMP_COOKIE_OAUTH_STATE,\n value: encodeURIComponent(stateValue),\n path: '/',\n sameSite: 'Lax',\n maxAge: OAUTH_TEMP_MAX_AGE_SEC,\n }),\n });\n\n return c.json({ authorization_url: authorizeUrl.toString() });\n}\n"],"mappings":";;;;;;;;AAmBA,eAAsB,sBACpB,GACA,SACA;CACA,MAAM,EAAE,mBAAmB,uBAAuB;CAClD,MAAM,kBAAkB,EAAE,IAAI,OAAO,oBAAoB,IAAI,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,mBAAmB,IAAI,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,KAAA;CAElD,MAAM,aAAa,IADH,IAAI,EAAE,IAAI,IACJ,CAAC,aAAa,IAAI,cAAc,IAAI;CAC1D,IAAI,CAAC,iBAAiB,WAAW,EAC/B,OAAO,EAAE,KAAK,uBAAuB,IAAI;CAG3C,MAAM,iBAAiB,IAAI,WAAW,GAAG;CACzC,OAAO,gBAAgB,eAAe;CACtC,MAAM,YAAY,UAAU,eAAe;CAC3C,MAAM,gBAAgB,MAAM,gBAAgB,UAAU;CAEtD,MAAM,oBAAoB,IAAI,WAAW,GAAG;CAC5C,OAAO,gBAAgB,kBAAkB;CACzC,MAAM,eAAe,UAAU,kBAAkB;CACjD,MAAM,gBAAgB,MAAM,gBAAgB,aAAa;CAEzD,MAAM,aAAa,UACjB,IAAI,aAAa,CAAC,OAChB,KAAK,UAAU;EACb,aAAa;EACb,KAAK;EACN,CAAC,CACH,CACF;CAED,MAAM,WAAW,kBAAkB,gBAC/B,gCAAgC;EAC9B,YAAY,EAAE,IAAI;EAClB,UAAU,QAAQ;EAClB;EACA;EACA;EACD,CAAC,GACF,kBAAkB;CAEtB,MAAM,cAAc,iCAAiC;EACnD,YAAY,EAAE,IAAI;EAClB,UAAU,QAAQ;EAClB;EACA;EACA;EACD,CAAC;CAEF,MAAM,eAAe,IAAI,IAAI,kBAAkB,6BAA6B;CAC5E,aAAa,aAAa,IAAI,iBAAiB,OAAO;CACtD,aAAa,aAAa,IAAI,aAAa,SAAS;CACpD,aAAa,aAAa,IAAI,gBAAgB,YAAY;CAC1D,aAAa,aAAa,IAAI,kBAAkB,cAAc;CAC9D,aAAa,aAAa,IAAI,yBAAyB,OAAO;CAC9D,aAAa,aAAa,IAAI,SAAS,WAAW;CAClD,aAAa,aAAa,IAAI,OAAO,cAAc;CAEnD,IAAI,CAAC,kBAAkB,eAAe;EACpC,MAAM,eACJ,+CAA+C,mBAAmB;EACpE,IAAI,CAAC,aAAa,IAChB,OAAO,EAAE,KAAK,aAAa,SAAS,aAAa,OAAoB;EAEvE,aAAa,aAAa,IAAI,SAAS,aAAa,MAAM;EAC1D,IAAI,aAAa,kBAAkB,KAAA,GACjC,aAAa,aAAa,IACxB,kBACA,aAAa,cACd;;CAIL,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT,CAAC;EACH,CAAC;CACF,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO,mBAAmB,aAAa;GACvC,MAAM;GACN,UAAU;GACV,QAAQ;GACT,CAAC;EACH,CAAC;CACF,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO,mBAAmB,WAAW;GACrC,MAAM;GACN,UAAU;GACV,QAAQ;GACT,CAAC;EACH,CAAC;CAEF,OAAO,EAAE,KAAK,EAAE,mBAAmB,aAAa,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"auth-init-session.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-init-session.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport {\n HUBSPOT_APP_ORIGIN_COOKIE_NAME,\n HUBSPOT_APP_SID_COOKIE_NAME,\n TEMP_COOKIE_OAUTH_STATE,\n TEMP_COOKIE_PKCE_VERIFIER,\n} from '../../constants.ts';\nimport { base64url } from '../../utils/base64-utils.ts';\nimport { sha256base64url } from '../../utils/crypto-utils.ts';\nimport { serializeCookie, setResponseCookie } from '../utils/cookie-utils.ts';\nimport { OAUTH_TEMP_MAX_AGE_SEC, SESSION_MAX_AGE_SEC } from './constants.ts';\nimport { deriveHubSpotAuthorizeScopesFromClientMetadata } from './fetch-hubspot-client-metadata.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildCimdClientIdUrlFromRequest,\n buildFrontendOAuthRedirectUri,\n isSafeReturnPath,\n parseAppOriginHeader,\n} from './utils.ts';\n\nexport async function handleAuthInitSession(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { hubspotConnectEnv, cimdClientMetadata } = 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 url = new URL(c.req.url);\n const returnPath = url.searchParams.get('return_path') ?? '/';\n if (!isSafeReturnPath(returnPath)) {\n return c.text('Invalid return_path', 400);\n }\n\n // The app origin pins the OAuth `redirect_uri` (which lands on the\n // frontend, not on this edge function) and, via the persisted\n // `__Host-hs_app_origin` cookie, drives credentialed\n // `Access-Control-Allow-Origin` on every subsequent SDK response.\n const appOrigin = parseAppOriginHeader(c.req.header('Origin'));\n if (!appOrigin) {\n return c.text(\n 'Missing or invalid Origin header; init-session must be called from a browser',\n 400\n );\n }\n\n const sessionIdBytes = new Uint8Array(32);\n crypto.getRandomValues(sessionIdBytes);\n const sessionId = base64url(sessionIdBytes);\n const sessionIdHash = await sha256base64url(sessionId);\n\n const codeVerifierBytes = new Uint8Array(32);\n crypto.getRandomValues(codeVerifierBytes);\n const codeVerifier = base64url(codeVerifierBytes);\n const codeChallenge = await sha256base64url(codeVerifier);\n\n const stateValue = base64url(\n new TextEncoder().encode(\n JSON.stringify({\n return_path: returnPath,\n sid: sessionIdHash,\n })\n )\n );\n\n const clientId = hubspotConnectEnv.isCimdEnabled\n ? buildCimdClientIdUrlFromRequest({\n requestUrl: c.req.url,\n basePath: options.basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n appOrigin,\n })\n : hubspotConnectEnv.hubspotClientId;\n\n console.log('clientId', clientId);\n const redirectUri = buildFrontendOAuthRedirectUri(appOrigin);\n\n const authorizeUrl = new URL(hubspotConnectEnv.hubspotAuthorizationEndpoint);\n authorizeUrl.searchParams.set('response_type', 'code');\n authorizeUrl.searchParams.set('client_id', clientId);\n authorizeUrl.searchParams.set('redirect_uri', redirectUri);\n authorizeUrl.searchParams.set('code_challenge', codeChallenge);\n authorizeUrl.searchParams.set('code_challenge_method', 'S256');\n authorizeUrl.searchParams.set('state', stateValue);\n authorizeUrl.searchParams.set('sid', sessionIdHash);\n\n if (!hubspotConnectEnv.isCimdEnabled) {\n const scopesResult =\n deriveHubSpotAuthorizeScopesFromClientMetadata(cimdClientMetadata);\n if (!scopesResult.ok) {\n return c.text(scopesResult.message, scopesResult.status as 500 | 502);\n }\n authorizeUrl.searchParams.set('scope', scopesResult.scope);\n if (scopesResult.optionalScope !== undefined) {\n authorizeUrl.searchParams.set(\n 'optional_scope',\n scopesResult.optionalScope\n );\n }\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_ORIGIN_COOKIE_NAME,\n value: appOrigin,\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: SESSION_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_SID_COOKIE_NAME,\n value: sessionId,\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: SESSION_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: TEMP_COOKIE_PKCE_VERIFIER,\n value: encodeURIComponent(codeVerifier),\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: OAUTH_TEMP_MAX_AGE_SEC,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: TEMP_COOKIE_OAUTH_STATE,\n value: encodeURIComponent(stateValue),\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: OAUTH_TEMP_MAX_AGE_SEC,\n }),\n });\n\n return c.json({ authorization_url: authorizeUrl.toString() });\n}\n"],"mappings":";;;;;;;;AAqBA,eAAsB,sBACpB,GACA,SACA;CACA,MAAM,EAAE,mBAAmB,uBAAuB;CAClD,MAAM,kBAAkB,EAAE,IAAI,OAAO,mBAAmB,KAAK,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,kBAAkB,KAAK,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,MAAM,KAAK,KAAA;CAElD,MAAM,aAAa,IADH,IAAI,EAAE,IAAI,GACL,EAAE,aAAa,IAAI,aAAa,KAAK;CAC1D,IAAI,CAAC,iBAAiB,UAAU,GAC9B,OAAO,EAAE,KAAK,uBAAuB,GAAG;CAO1C,MAAM,YAAY,qBAAqB,EAAE,IAAI,OAAO,QAAQ,CAAC;CAC7D,IAAI,CAAC,WACH,OAAO,EAAE,KACP,gFACA,GACF;CAGF,MAAM,iBAAiB,IAAI,WAAW,EAAE;CACxC,OAAO,gBAAgB,cAAc;CACrC,MAAM,YAAY,UAAU,cAAc;CAC1C,MAAM,gBAAgB,MAAM,gBAAgB,SAAS;CAErD,MAAM,oBAAoB,IAAI,WAAW,EAAE;CAC3C,OAAO,gBAAgB,iBAAiB;CACxC,MAAM,eAAe,UAAU,iBAAiB;CAChD,MAAM,gBAAgB,MAAM,gBAAgB,YAAY;CAExD,MAAM,aAAa,UACjB,IAAI,YAAY,EAAE,OAChB,KAAK,UAAU;EACb,aAAa;EACb,KAAK;CACP,CAAC,CACH,CACF;CAEA,MAAM,WAAW,kBAAkB,gBAC/B,gCAAgC;EAC9B,YAAY,EAAE,IAAI;EAClB,UAAU,QAAQ;EAClB;EACA;EACA;EACA;CACF,CAAC,IACD,kBAAkB;CAEtB,QAAQ,IAAI,YAAY,QAAQ;CAChC,MAAM,cAAc,8BAA8B,SAAS;CAE3D,MAAM,eAAe,IAAI,IAAI,kBAAkB,4BAA4B;CAC3E,aAAa,aAAa,IAAI,iBAAiB,MAAM;CACrD,aAAa,aAAa,IAAI,aAAa,QAAQ;CACnD,aAAa,aAAa,IAAI,gBAAgB,WAAW;CACzD,aAAa,aAAa,IAAI,kBAAkB,aAAa;CAC7D,aAAa,aAAa,IAAI,yBAAyB,MAAM;CAC7D,aAAa,aAAa,IAAI,SAAS,UAAU;CACjD,aAAa,aAAa,IAAI,OAAO,aAAa;CAElD,IAAI,CAAC,kBAAkB,eAAe;EACpC,MAAM,eACJ,+CAA+C,kBAAkB;EACnE,IAAI,CAAC,aAAa,IAChB,OAAO,EAAE,KAAK,aAAa,SAAS,aAAa,MAAmB;EAEtE,aAAa,aAAa,IAAI,SAAS,aAAa,KAAK;EACzD,IAAI,aAAa,kBAAkB,KAAA,GACjC,aAAa,aAAa,IACxB,kBACA,aAAa,aACf;CAEJ;CAEA,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO,mBAAmB,YAAY;GACtC,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO,mBAAmB,UAAU;GACpC,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CAED,OAAO,EAAE,KAAK,EAAE,mBAAmB,aAAa,SAAS,EAAE,CAAC;AAC9D"}
@@ -1,8 +1,8 @@
1
- import { HUBSPOT_ACCESS_TOKEN_COOKIE_NAME, HUBSPOT_APP_SID_COOKIE_NAME } from "../../constants.js";
1
+ import { HUBSPOT_ACCESS_TOKEN_COOKIE_NAME, HUBSPOT_APP_ORIGIN_COOKIE_NAME, HUBSPOT_APP_SID_COOKIE_NAME } from "../../constants.js";
2
2
  import { parseCookies } from "../../utils/cookie-utils.js";
3
3
  import { serializeCookie, setResponseCookie } from "../utils/cookie-utils.js";
4
4
  import { buildClientAssertion } from "./oauth-client.js";
5
- import { buildCimdClientIdUrlFromRequest } from "./utils.js";
5
+ import { buildCimdClientIdUrlFromRequest, parseAppOriginHeader } from "./utils.js";
6
6
  //#region src/server/hono/hubspot-connect-routes/auth-logout.ts
7
7
  async function revokeToken(options) {
8
8
  const { revokeEndpointUrl, body, logger } = options;
@@ -24,13 +24,19 @@ async function handleAuthLogout(c, options) {
24
24
  const requestHostHeader = c.req.header("host") ?? void 0;
25
25
  const cookies = parseCookies(c.req.header("Cookie"));
26
26
  const accessToken = cookies[HUBSPOT_ACCESS_TOKEN_COOKIE_NAME];
27
- const clientId = hubspotConnectEnv.isCimdEnabled ? buildCimdClientIdUrlFromRequest({
28
- requestUrl: c.req.url,
29
- basePath,
30
- xForwardedProto,
31
- xForwardedHost,
32
- requestHostHeader
33
- }) : hubspotConnectEnv.hubspotClientId;
27
+ let clientId;
28
+ if (hubspotConnectEnv.isCimdEnabled) {
29
+ const appOrigin = parseAppOriginHeader(c.req.header("Origin"));
30
+ if (!appOrigin) return c.json({ error: "Missing or invalid Origin header" }, 400);
31
+ clientId = buildCimdClientIdUrlFromRequest({
32
+ requestUrl: c.req.url,
33
+ basePath,
34
+ xForwardedProto,
35
+ xForwardedHost,
36
+ requestHostHeader,
37
+ appOrigin
38
+ });
39
+ } else clientId = hubspotConnectEnv.hubspotClientId;
34
40
  const revokeEndpointUrl = new URL("/oauth/v1/revoke", hubspotConnectEnv.hubspotOAuthApiOrigin).href;
35
41
  if (accessToken) if (hubspotConnectEnv.isCimdEnabled) {
36
42
  if (!appKeys) return c.json({ error: "Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD is enabled" }, 500);
@@ -66,6 +72,8 @@ async function handleAuthLogout(c, options) {
66
72
  name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,
67
73
  value: "",
68
74
  path: "/",
75
+ sameSite: "None",
76
+ partitioned: true,
69
77
  maxAge: 0
70
78
  })
71
79
  });
@@ -75,6 +83,19 @@ async function handleAuthLogout(c, options) {
75
83
  name: HUBSPOT_APP_SID_COOKIE_NAME,
76
84
  value: "",
77
85
  path: "/",
86
+ sameSite: "None",
87
+ partitioned: true,
88
+ maxAge: 0
89
+ })
90
+ });
91
+ setResponseCookie({
92
+ c,
93
+ value: serializeCookie({
94
+ name: HUBSPOT_APP_ORIGIN_COOKIE_NAME,
95
+ value: "",
96
+ path: "/",
97
+ sameSite: "None",
98
+ partitioned: true,
78
99
  maxAge: 0
79
100
  })
80
101
  });
@@ -85,6 +106,8 @@ async function handleAuthLogout(c, options) {
85
106
  name: cookieName,
86
107
  value: "",
87
108
  path: refreshCookiePath,
109
+ sameSite: "None",
110
+ partitioned: true,
88
111
  maxAge: 0
89
112
  })
90
113
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auth-logout.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-logout.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport type { Logger } from '../../../shared/logger.ts';\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_APP_SID_COOKIE_NAME,\n HUBSPOT_REFRESH_COOKIE_PREFIX,\n} from '../../constants.ts';\nimport { parseCookies } from '../../utils/cookie-utils.ts';\nimport { serializeCookie, setResponseCookie } from '../utils/cookie-utils.ts';\nimport { buildClientAssertion } from './oauth-client.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport { buildCimdClientIdUrlFromRequest } from './utils.ts';\n\nasync function revokeToken(options: {\n revokeEndpointUrl: string;\n body: URLSearchParams;\n logger: Logger;\n}): Promise<void> {\n const { revokeEndpointUrl, body, logger } = options;\n try {\n const response = await fetch(revokeEndpointUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n });\n if (!response.ok) {\n logger.warn(\n `HubSpot token revoke returned HTTP ${response.status} ${response.statusText}`\n );\n }\n } catch (error) {\n logger.warn('HubSpot token revoke request failed', error);\n }\n}\n\nexport async function handleAuthLogout(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv, logger } =\n 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 cookies = parseCookies(c.req.header('Cookie'));\n const accessToken = cookies[HUBSPOT_ACCESS_TOKEN_COOKIE_NAME];\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 revokeEndpointUrl = new URL(\n '/oauth/v1/revoke',\n hubspotConnectEnv.hubspotOAuthApiOrigin\n ).href;\n\n if (accessToken) {\n if (hubspotConnectEnv.isCimdEnabled) {\n if (!appKeys) {\n return c.json(\n {\n error:\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD is enabled',\n },\n 500\n );\n }\n const clientAssertion = await buildClientAssertion({\n appKeys,\n clientId,\n audience: revokeEndpointUrl,\n });\n await revokeToken({\n revokeEndpointUrl,\n body: new URLSearchParams({\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: clientId,\n client_assertion_type:\n 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',\n client_assertion: clientAssertion,\n }),\n logger,\n });\n } else {\n await revokeToken({\n revokeEndpointUrl,\n body: new URLSearchParams({\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: clientId,\n client_secret: hubspotConnectEnv.hubspotClientSecret,\n }),\n logger,\n });\n }\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n value: '',\n path: '/',\n maxAge: 0,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_SID_COOKIE_NAME,\n value: '',\n path: '/',\n maxAge: 0,\n }),\n });\n\n Object.keys(cookies).forEach((cookieName) => {\n if (cookieName.startsWith(HUBSPOT_REFRESH_COOKIE_PREFIX)) {\n setResponseCookie({\n c,\n value: serializeCookie({\n name: cookieName,\n value: '',\n path: refreshCookiePath,\n maxAge: 0,\n }),\n });\n }\n });\n\n return c.json({ redirect_to: '/' });\n}\n"],"mappings":";;;;;;AAcA,eAAe,YAAY,SAIT;CAChB,MAAM,EAAE,mBAAmB,MAAM,WAAW;CAC5C,IAAI;EACF,MAAM,WAAW,MAAM,MAAM,mBAAmB;GAC9C,QAAQ;GACR,SAAS,EAAE,gBAAgB,qCAAqC;GAChE;GACD,CAAC;EACF,IAAI,CAAC,SAAS,IACZ,OAAO,KACL,sCAAsC,SAAS,OAAO,GAAG,SAAS,aACnE;UAEI,OAAO;EACd,OAAO,KAAK,uCAAuC,MAAM;;;AAI7D,eAAsB,iBACpB,GACA,SACA;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,mBAAmB,WAC/D;CACF,MAAM,kBAAkB,EAAE,IAAI,OAAO,oBAAoB,IAAI,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,mBAAmB,IAAI,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,KAAA;CAClD,MAAM,UAAU,aAAa,EAAE,IAAI,OAAO,SAAS,CAAC;CACpD,MAAM,cAAc,QAAQ;CAE5B,MAAM,WAAW,kBAAkB,gBAC/B,gCAAgC;EAC9B,YAAY,EAAE,IAAI;EAClB;EACA;EACA;EACA;EACD,CAAC,GACF,kBAAkB;CAEtB,MAAM,oBAAoB,IAAI,IAC5B,oBACA,kBAAkB,sBACnB,CAAC;CAEF,IAAI,aACF,IAAI,kBAAkB,eAAe;EACnC,IAAI,CAAC,SACH,OAAO,EAAE,KACP,EACE,OACE,qFACH,EACD,IACD;EAEH,MAAM,kBAAkB,MAAM,qBAAqB;GACjD;GACA;GACA,UAAU;GACX,CAAC;EACF,MAAM,YAAY;GAChB;GACA,MAAM,IAAI,gBAAgB;IACxB,OAAO;IACP,iBAAiB;IACjB,WAAW;IACX,uBACE;IACF,kBAAkB;IACnB,CAAC;GACF;GACD,CAAC;QAEF,MAAM,YAAY;EAChB;EACA,MAAM,IAAI,gBAAgB;GACxB,OAAO;GACP,iBAAiB;GACjB,WAAW;GACX,eAAe,kBAAkB;GAClC,CAAC;EACF;EACD,CAAC;CAIN,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT,CAAC;EACH,CAAC;CACF,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT,CAAC;EACH,CAAC;CAEF,OAAO,KAAK,QAAQ,CAAC,SAAS,eAAe;EAC3C,IAAI,WAAW,WAAA,cAAyC,EACtD,kBAAkB;GAChB;GACA,OAAO,gBAAgB;IACrB,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACT,CAAC;GACH,CAAC;GAEJ;CAEF,OAAO,EAAE,KAAK,EAAE,aAAa,KAAK,CAAC"}
1
+ {"version":3,"file":"auth-logout.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-logout.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport type { Logger } from '../../../shared/logger.ts';\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_APP_ORIGIN_COOKIE_NAME,\n HUBSPOT_APP_SID_COOKIE_NAME,\n HUBSPOT_REFRESH_COOKIE_PREFIX,\n} from '../../constants.ts';\nimport { parseCookies } from '../../utils/cookie-utils.ts';\nimport { serializeCookie, setResponseCookie } from '../utils/cookie-utils.ts';\nimport { buildClientAssertion } from './oauth-client.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildCimdClientIdUrlFromRequest,\n parseAppOriginHeader,\n} from './utils.ts';\n\nasync function revokeToken(options: {\n revokeEndpointUrl: string;\n body: URLSearchParams;\n logger: Logger;\n}): Promise<void> {\n const { revokeEndpointUrl, body, logger } = options;\n try {\n const response = await fetch(revokeEndpointUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n });\n if (!response.ok) {\n logger.warn(\n `HubSpot token revoke returned HTTP ${response.status} ${response.statusText}`\n );\n }\n } catch (error) {\n logger.warn('HubSpot token revoke request failed', error);\n }\n}\n\nexport async function handleAuthLogout(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n) {\n const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv, logger } =\n 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 cookies = parseCookies(c.req.header('Cookie'));\n const accessToken = cookies[HUBSPOT_ACCESS_TOKEN_COOKIE_NAME];\n\n let clientId: string;\n if (hubspotConnectEnv.isCimdEnabled) {\n const appOrigin = parseAppOriginHeader(c.req.header('Origin'));\n if (!appOrigin) {\n return c.json({ error: 'Missing or invalid Origin header' }, 400);\n }\n clientId = buildCimdClientIdUrlFromRequest({\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n appOrigin,\n });\n } else {\n clientId = hubspotConnectEnv.hubspotClientId;\n }\n\n const revokeEndpointUrl = new URL(\n '/oauth/v1/revoke',\n hubspotConnectEnv.hubspotOAuthApiOrigin\n ).href;\n\n if (accessToken) {\n if (hubspotConnectEnv.isCimdEnabled) {\n if (!appKeys) {\n return c.json(\n {\n error:\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD is enabled',\n },\n 500\n );\n }\n const clientAssertion = await buildClientAssertion({\n appKeys,\n clientId,\n audience: revokeEndpointUrl,\n });\n await revokeToken({\n revokeEndpointUrl,\n body: new URLSearchParams({\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: clientId,\n client_assertion_type:\n 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',\n client_assertion: clientAssertion,\n }),\n logger,\n });\n } else {\n await revokeToken({\n revokeEndpointUrl,\n body: new URLSearchParams({\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: clientId,\n client_secret: hubspotConnectEnv.hubspotClientSecret,\n }),\n logger,\n });\n }\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n value: '',\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: 0,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_SID_COOKIE_NAME,\n value: '',\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: 0,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_APP_ORIGIN_COOKIE_NAME,\n value: '',\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: 0,\n }),\n });\n\n Object.keys(cookies).forEach((cookieName) => {\n if (cookieName.startsWith(HUBSPOT_REFRESH_COOKIE_PREFIX)) {\n setResponseCookie({\n c,\n value: serializeCookie({\n name: cookieName,\n value: '',\n path: refreshCookiePath,\n sameSite: 'None',\n partitioned: true,\n maxAge: 0,\n }),\n });\n }\n });\n\n return c.json({ redirect_to: '/' });\n}\n"],"mappings":";;;;;;AAkBA,eAAe,YAAY,SAIT;CAChB,MAAM,EAAE,mBAAmB,MAAM,WAAW;CAC5C,IAAI;EACF,MAAM,WAAW,MAAM,MAAM,mBAAmB;GAC9C,QAAQ;GACR,SAAS,EAAE,gBAAgB,oCAAoC;GAC/D;EACF,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,OAAO,KACL,sCAAsC,SAAS,OAAO,GAAG,SAAS,YACpE;CAEJ,SAAS,OAAO;EACd,OAAO,KAAK,uCAAuC,KAAK;CAC1D;AACF;AAEA,eAAsB,iBACpB,GACA,SACA;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,mBAAmB,WAC/D;CACF,MAAM,kBAAkB,EAAE,IAAI,OAAO,mBAAmB,KAAK,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,kBAAkB,KAAK,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,MAAM,KAAK,KAAA;CAClD,MAAM,UAAU,aAAa,EAAE,IAAI,OAAO,QAAQ,CAAC;CACnD,MAAM,cAAc,QAAQ;CAE5B,IAAI;CACJ,IAAI,kBAAkB,eAAe;EACnC,MAAM,YAAY,qBAAqB,EAAE,IAAI,OAAO,QAAQ,CAAC;EAC7D,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,mCAAmC,GAAG,GAAG;EAElE,WAAW,gCAAgC;GACzC,YAAY,EAAE,IAAI;GAClB;GACA;GACA;GACA;GACA;EACF,CAAC;CACH,OACE,WAAW,kBAAkB;CAG/B,MAAM,oBAAoB,IAAI,IAC5B,oBACA,kBAAkB,qBACpB,EAAE;CAEF,IAAI,aACF,IAAI,kBAAkB,eAAe;EACnC,IAAI,CAAC,SACH,OAAO,EAAE,KACP,EACE,OACE,oFACJ,GACA,GACF;EAEF,MAAM,kBAAkB,MAAM,qBAAqB;GACjD;GACA;GACA,UAAU;EACZ,CAAC;EACD,MAAM,YAAY;GAChB;GACA,MAAM,IAAI,gBAAgB;IACxB,OAAO;IACP,iBAAiB;IACjB,WAAW;IACX,uBACE;IACF,kBAAkB;GACpB,CAAC;GACD;EACF,CAAC;CACH,OACE,MAAM,YAAY;EAChB;EACA,MAAM,IAAI,gBAAgB;GACxB,OAAO;GACP,iBAAiB;GACjB,WAAW;GACX,eAAe,kBAAkB;EACnC,CAAC;EACD;CACF,CAAC;CAIL,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CAED,OAAO,KAAK,OAAO,EAAE,SAAS,eAAe;EAC3C,IAAI,WAAW,WAAA,aAAwC,GACrD,kBAAkB;GAChB;GACA,OAAO,gBAAgB;IACrB,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,aAAa;IACb,QAAQ;GACV,CAAC;EACH,CAAC;CAEL,CAAC;CAED,OAAO,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC;AACpC"}
@@ -4,7 +4,7 @@ import { parseCookies } from "../../utils/cookie-utils.js";
4
4
  import { serializeCookie, setResponseCookie } from "../utils/cookie-utils.js";
5
5
  import { REFRESH_COOKIE_MAX_AGE_SEC } from "./constants.js";
6
6
  import { buildClientAssertion, buildClientAssertionFormParams, buildClientSecretFormParams, buildTokenEndpointDpopProof, requestOAuthToken } from "./oauth-client.js";
7
- import { buildCimdClientIdUrlFromRequest, isPositiveFiniteNumber } from "./utils.js";
7
+ import { buildCimdClientIdUrlFromRequest, isPositiveFiniteNumber, parseAppOriginHeader } from "./utils.js";
8
8
  //#region src/server/hono/hubspot-connect-routes/auth-refresh.ts
9
9
  async function handleAuthRefresh(c, options) {
10
10
  const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv } = options;
@@ -19,13 +19,19 @@ async function handleAuthRefresh(c, options) {
19
19
  const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sidHash}`;
20
20
  const refreshToken = cookies[refreshCookieName];
21
21
  if (!refreshToken) return c.json({ error: "Missing refresh token" }, 401);
22
- const clientId = hubspotConnectEnv.isCimdEnabled ? buildCimdClientIdUrlFromRequest({
23
- requestUrl: c.req.url,
24
- basePath,
25
- xForwardedProto,
26
- xForwardedHost,
27
- requestHostHeader
28
- }) : hubspotConnectEnv.hubspotClientId;
22
+ let clientId;
23
+ if (hubspotConnectEnv.isCimdEnabled) {
24
+ const appOrigin = parseAppOriginHeader(c.req.header("Origin"));
25
+ if (!appOrigin) return c.json({ error: "Missing or invalid Origin header" }, 400);
26
+ clientId = buildCimdClientIdUrlFromRequest({
27
+ requestUrl: c.req.url,
28
+ basePath,
29
+ xForwardedProto,
30
+ xForwardedHost,
31
+ requestHostHeader,
32
+ appOrigin
33
+ });
34
+ } else clientId = hubspotConnectEnv.hubspotClientId;
29
35
  const tokenEndpointUrl = new URL("/oauth/v1/token", hubspotConnectEnv.hubspotOAuthApiOrigin).href;
30
36
  let dpopProof;
31
37
  if (hubspotConnectEnv.isDpopEnabled) dpopProof = await buildTokenEndpointDpopProof({
@@ -34,19 +40,21 @@ async function handleAuthRefresh(c, options) {
34
40
  sessionIdHash: sidHash
35
41
  });
36
42
  let formParams;
37
- if (hubspotConnectEnv.isCimdEnabled) formParams = {
38
- grant_type: "refresh_token",
39
- refresh_token: refreshToken,
40
- ...buildClientAssertionFormParams({
43
+ if (hubspotConnectEnv.isCimdEnabled) {
44
+ const clientAssertion = await buildClientAssertion({
45
+ appKeys,
41
46
  clientId,
42
- clientAssertion: await buildClientAssertion({
43
- appKeys,
47
+ audience: tokenEndpointUrl
48
+ });
49
+ formParams = {
50
+ grant_type: "refresh_token",
51
+ refresh_token: refreshToken,
52
+ ...buildClientAssertionFormParams({
44
53
  clientId,
45
- audience: tokenEndpointUrl
54
+ clientAssertion
46
55
  })
47
- })
48
- };
49
- else formParams = {
56
+ };
57
+ } else formParams = {
50
58
  grant_type: "refresh_token",
51
59
  refresh_token: refreshToken,
52
60
  ...buildClientSecretFormParams({
@@ -70,6 +78,8 @@ async function handleAuthRefresh(c, options) {
70
78
  name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,
71
79
  value: newAccessToken,
72
80
  path: "/",
81
+ sameSite: "None",
82
+ partitioned: true,
73
83
  maxAge: expires_in
74
84
  })
75
85
  });
@@ -79,6 +89,8 @@ async function handleAuthRefresh(c, options) {
79
89
  name: refreshCookieName,
80
90
  value: newRefreshToken,
81
91
  path: refreshCookiePath,
92
+ sameSite: "None",
93
+ partitioned: true,
82
94
  maxAge: REFRESH_COOKIE_MAX_AGE_SEC
83
95
  })
84
96
  });
@@ -89,6 +101,8 @@ async function handleAuthRefresh(c, options) {
89
101
  name: cookieName,
90
102
  value: "",
91
103
  path: refreshCookiePath,
104
+ sameSite: "None",
105
+ partitioned: true,
92
106
  maxAge: 0
93
107
  })
94
108
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auth-refresh.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-refresh.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_APP_SID_COOKIE_NAME,\n HUBSPOT_REFRESH_COOKIE_PREFIX,\n} from '../../constants.ts';\nimport { parseCookies } from '../../utils/cookie-utils.ts';\nimport { sha256base64url } from '../../utils/crypto-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 isPositiveFiniteNumber,\n} from './utils.ts';\n\nexport async function handleAuthRefresh(\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 cookies = parseCookies(c.req.header('Cookie'));\n const sessionId = cookies[HUBSPOT_APP_SID_COOKIE_NAME];\n if (!sessionId) {\n return c.json({ error: 'Missing session cookie' }, 401);\n }\n\n if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) {\n return c.json(\n {\n error:\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled',\n },\n 500\n );\n }\n\n const sidHash = await sha256base64url(sessionId);\n const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sidHash}`;\n const refreshToken = cookies[refreshCookieName];\n if (!refreshToken) {\n return c.json({ error: 'Missing refresh token' }, 401);\n }\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 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: sidHash,\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: 'refresh_token',\n refresh_token: refreshToken,\n ...buildClientAssertionFormParams({ clientId, clientAssertion }),\n };\n } else {\n formParams = {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\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.json(\n { error: `Token refresh failed: ${tokenResult.errorText}` },\n 502\n );\n }\n\n const {\n access_token: newAccessToken,\n refresh_token: newRefreshToken,\n expires_in,\n } = tokenResult.body;\n\n if (!newRefreshToken) {\n return c.json({ error: 'Token response missing refresh_token' }, 502);\n }\n if (!isPositiveFiniteNumber(expires_in)) {\n return c.json(\n { error: 'Token response missing or invalid expires_in' },\n 502\n );\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n value: newAccessToken,\n path: '/',\n maxAge: expires_in,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: refreshCookieName,\n value: newRefreshToken,\n path: refreshCookiePath,\n maxAge: REFRESH_COOKIE_MAX_AGE_SEC,\n }),\n });\n\n // Cookies prefixed with HUBSPOT_REFRESH_COOKIE_PREFIX that don't match the\n // new refresh cookie name are stale and need to be cleared.\n Object.keys(cookies).forEach((cookieName) => {\n if (\n cookieName.startsWith(HUBSPOT_REFRESH_COOKIE_PREFIX) &&\n cookieName !== refreshCookieName\n ) {\n setResponseCookie({\n c,\n value: serializeCookie({\n name: cookieName,\n value: '',\n path: refreshCookiePath,\n maxAge: 0,\n }),\n });\n }\n });\n\n return c.json({ expires_in });\n}\n"],"mappings":";;;;;;;;AAwBA,eAAsB,kBACpB,GACA,SACA;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,sBAAsB;CACpE,MAAM,kBAAkB,EAAE,IAAI,OAAO,oBAAoB,IAAI,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,mBAAmB,IAAI,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,KAAA;CAClD,MAAM,UAAU,aAAa,EAAE,IAAI,OAAO,SAAS,CAAC;CACpD,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,0BAA0B,EAAE,IAAI;CAGzD,IAAI,kBAAkB,2BAA2B,CAAC,SAChD,OAAO,EAAE,KACP,EACE,OACE,6FACH,EACD,IACD;CAGH,MAAM,UAAU,MAAM,gBAAgB,UAAU;CAChD,MAAM,oBAAoB,GAAG,gCAAgC;CAC7D,MAAM,eAAe,QAAQ;CAC7B,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,EAAE,IAAI;CAGxD,MAAM,WAAW,kBAAkB,gBAC/B,gCAAgC;EAC9B,YAAY,EAAE,IAAI;EAClB;EACA;EACA;EACA;EACD,CAAC,GACF,kBAAkB;CAEtB,MAAM,mBAAmB,IAAI,IAC3B,mBACA,kBAAkB,sBACnB,CAAC;CAEF,IAAI;CACJ,IAAI,kBAAkB,eACpB,YAAY,MAAM,4BAA4B;EACnC;EACT;EACA,eAAe;EAChB,CAAC;CAGJ,IAAI;CACJ,IAAI,kBAAkB,eAMpB,aAAa;EACX,YAAY;EACZ,eAAe;EACf,GAAG,+BAA+B;GAAE;GAAU,iBAAA,MARlB,qBAAqB;IACxC;IACT;IACA,UAAU;IACX,CAAC;GAI+D,CAAC;EACjE;MAED,aAAa;EACX,YAAY;EACZ,eAAe;EACf,GAAG,4BAA4B;GAC7B;GACA,cAAc,kBAAkB;GACjC,CAAC;EACH;CAGH,MAAM,cAAc,MAAM,kBAAkB;EAC1C;EACA,eAAe,kBAAkB;EACjC,GAAI,cAAc,KAAA,IAAY,EAAE,WAAW,GAAG,EAAE;EAChD;EACD,CAAC;CACF,IAAI,CAAC,YAAY,IACf,OAAO,EAAE,KACP,EAAE,OAAO,yBAAyB,YAAY,aAAa,EAC3D,IACD;CAGH,MAAM,EACJ,cAAc,gBACd,eAAe,iBACf,eACE,YAAY;CAEhB,IAAI,CAAC,iBACH,OAAO,EAAE,KAAK,EAAE,OAAO,wCAAwC,EAAE,IAAI;CAEvE,IAAI,CAAC,uBAAuB,WAAW,EACrC,OAAO,EAAE,KACP,EAAE,OAAO,gDAAgD,EACzD,IACD;CAGH,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT,CAAC;EACH,CAAC;CACF,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACT,CAAC;EACH,CAAC;CAIF,OAAO,KAAK,QAAQ,CAAC,SAAS,eAAe;EAC3C,IACE,WAAW,WAAA,cAAyC,IACpD,eAAe,mBAEf,kBAAkB;GAChB;GACA,OAAO,gBAAgB;IACrB,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACT,CAAC;GACH,CAAC;GAEJ;CAEF,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC"}
1
+ {"version":3,"file":"auth-refresh.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/auth-refresh.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport {\n HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n HUBSPOT_APP_SID_COOKIE_NAME,\n HUBSPOT_REFRESH_COOKIE_PREFIX,\n} from '../../constants.ts';\nimport { parseCookies } from '../../utils/cookie-utils.ts';\nimport { sha256base64url } from '../../utils/crypto-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 isPositiveFiniteNumber,\n parseAppOriginHeader,\n} from './utils.ts';\n\nexport async function handleAuthRefresh(\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 cookies = parseCookies(c.req.header('Cookie'));\n const sessionId = cookies[HUBSPOT_APP_SID_COOKIE_NAME];\n if (!sessionId) {\n return c.json({ error: 'Missing session cookie' }, 401);\n }\n\n if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) {\n return c.json(\n {\n error:\n 'Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled',\n },\n 500\n );\n }\n\n const sidHash = await sha256base64url(sessionId);\n const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sidHash}`;\n const refreshToken = cookies[refreshCookieName];\n if (!refreshToken) {\n return c.json({ error: 'Missing refresh token' }, 401);\n }\n\n let clientId: string;\n if (hubspotConnectEnv.isCimdEnabled) {\n const appOrigin = parseAppOriginHeader(c.req.header('Origin'));\n if (!appOrigin) {\n return c.json({ error: 'Missing or invalid Origin header' }, 400);\n }\n clientId = buildCimdClientIdUrlFromRequest({\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n appOrigin,\n });\n } else {\n clientId = hubspotConnectEnv.hubspotClientId;\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: sidHash,\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: 'refresh_token',\n refresh_token: refreshToken,\n ...buildClientAssertionFormParams({ clientId, clientAssertion }),\n };\n } else {\n formParams = {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\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.json(\n { error: `Token refresh failed: ${tokenResult.errorText}` },\n 502\n );\n }\n\n const {\n access_token: newAccessToken,\n refresh_token: newRefreshToken,\n expires_in,\n } = tokenResult.body;\n\n if (!newRefreshToken) {\n return c.json({ error: 'Token response missing refresh_token' }, 502);\n }\n if (!isPositiveFiniteNumber(expires_in)) {\n return c.json(\n { error: 'Token response missing or invalid expires_in' },\n 502\n );\n }\n\n setResponseCookie({\n c,\n value: serializeCookie({\n name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,\n value: newAccessToken,\n path: '/',\n sameSite: 'None',\n partitioned: true,\n maxAge: expires_in,\n }),\n });\n setResponseCookie({\n c,\n value: serializeCookie({\n name: refreshCookieName,\n value: newRefreshToken,\n path: refreshCookiePath,\n sameSite: 'None',\n partitioned: true,\n maxAge: REFRESH_COOKIE_MAX_AGE_SEC,\n }),\n });\n\n // Cookies prefixed with HUBSPOT_REFRESH_COOKIE_PREFIX that don't match the\n // new refresh cookie name are stale and need to be cleared.\n Object.keys(cookies).forEach((cookieName) => {\n if (\n cookieName.startsWith(HUBSPOT_REFRESH_COOKIE_PREFIX) &&\n cookieName !== refreshCookieName\n ) {\n setResponseCookie({\n c,\n value: serializeCookie({\n name: cookieName,\n value: '',\n path: refreshCookiePath,\n sameSite: 'None',\n partitioned: true,\n maxAge: 0,\n }),\n });\n }\n });\n\n return c.json({ expires_in });\n}\n"],"mappings":";;;;;;;;AAyBA,eAAsB,kBACpB,GACA,SACA;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,sBAAsB;CACpE,MAAM,kBAAkB,EAAE,IAAI,OAAO,mBAAmB,KAAK,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,kBAAkB,KAAK,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,MAAM,KAAK,KAAA;CAClD,MAAM,UAAU,aAAa,EAAE,IAAI,OAAO,QAAQ,CAAC;CACnD,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;CAGxD,IAAI,kBAAkB,2BAA2B,CAAC,SAChD,OAAO,EAAE,KACP,EACE,OACE,4FACJ,GACA,GACF;CAGF,MAAM,UAAU,MAAM,gBAAgB,SAAS;CAC/C,MAAM,oBAAoB,GAAG,gCAAgC;CAC7D,MAAM,eAAe,QAAQ;CAC7B,IAAI,CAAC,cACH,OAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;CAGvD,IAAI;CACJ,IAAI,kBAAkB,eAAe;EACnC,MAAM,YAAY,qBAAqB,EAAE,IAAI,OAAO,QAAQ,CAAC;EAC7D,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,EAAE,OAAO,mCAAmC,GAAG,GAAG;EAElE,WAAW,gCAAgC;GACzC,YAAY,EAAE,IAAI;GAClB;GACA;GACA;GACA;GACA;EACF,CAAC;CACH,OACE,WAAW,kBAAkB;CAG/B,MAAM,mBAAmB,IAAI,IAC3B,mBACA,kBAAkB,qBACpB,EAAE;CAEF,IAAI;CACJ,IAAI,kBAAkB,eACpB,YAAY,MAAM,4BAA4B;EACnC;EACT;EACA,eAAe;CACjB,CAAC;CAGH,IAAI;CACJ,IAAI,kBAAkB,eAAe;EACnC,MAAM,kBAAkB,MAAM,qBAAqB;GACxC;GACT;GACA,UAAU;EACZ,CAAC;EACD,aAAa;GACX,YAAY;GACZ,eAAe;GACf,GAAG,+BAA+B;IAAE;IAAU;GAAgB,CAAC;EACjE;CACF,OACE,aAAa;EACX,YAAY;EACZ,eAAe;EACf,GAAG,4BAA4B;GAC7B;GACA,cAAc,kBAAkB;EAClC,CAAC;CACH;CAGF,MAAM,cAAc,MAAM,kBAAkB;EAC1C;EACA,eAAe,kBAAkB;EACjC,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;EAC/C;CACF,CAAC;CACD,IAAI,CAAC,YAAY,IACf,OAAO,EAAE,KACP,EAAE,OAAO,yBAAyB,YAAY,YAAY,GAC1D,GACF;CAGF,MAAM,EACJ,cAAc,gBACd,eAAe,iBACf,eACE,YAAY;CAEhB,IAAI,CAAC,iBACH,OAAO,EAAE,KAAK,EAAE,OAAO,uCAAuC,GAAG,GAAG;CAEtE,IAAI,CAAC,uBAAuB,UAAU,GACpC,OAAO,EAAE,KACP,EAAE,OAAO,+CAA+C,GACxD,GACF;CAGF,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CACD,kBAAkB;EAChB;EACA,OAAO,gBAAgB;GACrB,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,aAAa;GACb,QAAQ;EACV,CAAC;CACH,CAAC;CAID,OAAO,KAAK,OAAO,EAAE,SAAS,eAAe;EAC3C,IACE,WAAW,WAAA,aAAwC,KACnD,eAAe,mBAEf,kBAAkB;GAChB;GACA,OAAO,gBAAgB;IACrB,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,aAAa;IACb,QAAQ;GACV,CAAC;EACH,CAAC;CAEL,CAAC;CAED,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;AAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"cimd-client-metadata-types.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/cimd-client-metadata-types.ts"],"sourcesContent":["/**\n * Caller-supplied scope configuration for the CIMD document served at\n * `{basePath}/client.json`. `redirect_uri` and `jwks_uri` are derived at\n * request time by the hubspot-connect routes.\n */\nexport interface HubSpotConnectCimdClientMetadata {\n scope: HubSpotConnectCimdClientScope;\n}\n\nexport interface HubSpotConnectCimdClientScope {\n required: string[];\n optional?: string[];\n}\n\n/**\n * JSON body returned by `GET {basePath}/client.json` (HubSpot CIMD).\n */\nexport interface HubSpotConnectCimdClientDocument {\n redirect_uri: string;\n jwks_uri: string;\n scope: HubSpotConnectCimdClientScope;\n}\n\nexport function assertHubSpotConnectCimdClientMetadata(\n value: HubSpotConnectCimdClientMetadata\n): void {\n const required = value.scope?.required;\n const requiredOk =\n Array.isArray(required) &&\n required.length > 0 &&\n required.every((s) => typeof s === 'string' && s.length > 0);\n if (!requiredOk) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.required must be a non-empty array of non-empty strings'\n );\n }\n const optional = value.scope.optional;\n if (optional === undefined) {\n return;\n }\n if (!Array.isArray(optional)) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.optional must be an array when set'\n );\n }\n if (\n optional.length > 0 &&\n !optional.every((s) => typeof s === 'string' && s.length > 0)\n ) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.optional entries must be non-empty strings'\n );\n }\n}\n"],"mappings":";AAuBA,SAAgB,uCACd,OACM;CACN,MAAM,WAAW,MAAM,OAAO;CAK9B,IAAI,EAHF,MAAM,QAAQ,SAAS,IACvB,SAAS,SAAS,KAClB,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,EAAE,GAE5D,MAAM,IAAI,MACR,iGACD;CAEH,MAAM,WAAW,MAAM,MAAM;CAC7B,IAAI,aAAa,KAAA,GACf;CAEF,IAAI,CAAC,MAAM,QAAQ,SAAS,EAC1B,MAAM,IAAI,MACR,4EACD;CAEH,IACE,SAAS,SAAS,KAClB,CAAC,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,EAAE,EAE7D,MAAM,IAAI,MACR,oFACD"}
1
+ {"version":3,"file":"cimd-client-metadata-types.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/cimd-client-metadata-types.ts"],"sourcesContent":["/**\n * Caller-supplied scope configuration for the CIMD document served at\n * `{basePath}/client.json`. `redirect_uri` and `jwks_uri` are derived at\n * request time by the hubspot-connect routes.\n */\nexport interface HubSpotConnectCimdClientMetadata {\n scope: HubSpotConnectCimdClientScope;\n}\n\nexport interface HubSpotConnectCimdClientScope {\n required: string[];\n optional?: string[];\n}\n\n/**\n * JSON body returned by `GET {basePath}/client.json` (HubSpot CIMD).\n */\nexport interface HubSpotConnectCimdClientDocument {\n redirect_uri: string;\n jwks_uri: string;\n scope: HubSpotConnectCimdClientScope;\n}\n\nexport function assertHubSpotConnectCimdClientMetadata(\n value: HubSpotConnectCimdClientMetadata\n): void {\n const required = value.scope?.required;\n const requiredOk =\n Array.isArray(required) &&\n required.length > 0 &&\n required.every((s) => typeof s === 'string' && s.length > 0);\n if (!requiredOk) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.required must be a non-empty array of non-empty strings'\n );\n }\n const optional = value.scope.optional;\n if (optional === undefined) {\n return;\n }\n if (!Array.isArray(optional)) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.optional must be an array when set'\n );\n }\n if (\n optional.length > 0 &&\n !optional.every((s) => typeof s === 'string' && s.length > 0)\n ) {\n throw new Error(\n 'HubSpotConnectCimdClientMetadata.scope.optional entries must be non-empty strings'\n );\n }\n}\n"],"mappings":";AAuBA,SAAgB,uCACd,OACM;CACN,MAAM,WAAW,MAAM,OAAO;CAK9B,IAAI,EAHF,MAAM,QAAQ,QAAQ,KACtB,SAAS,SAAS,KAClB,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,IAE3D,MAAM,IAAI,MACR,gGACF;CAEF,MAAM,WAAW,MAAM,MAAM;CAC7B,IAAI,aAAa,KAAA,GACf;CAEF,IAAI,CAAC,MAAM,QAAQ,QAAQ,GACzB,MAAM,IAAI,MACR,2EACF;CAEF,IACE,SAAS,SAAS,KAClB,CAAC,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,GAE5D,MAAM,IAAI,MACR,mFACF;AAEJ"}
@@ -7,12 +7,15 @@ async function handleCimdClientJson(c, options) {
7
7
  const xForwardedProto = c.req.header("x-forwarded-proto") ?? void 0;
8
8
  const xForwardedHost = c.req.header("x-forwarded-host") ?? void 0;
9
9
  const requestHostHeader = c.req.header("host") ?? void 0;
10
+ const appOrigin = c.req.query("app_origin");
11
+ if (!appOrigin) return c.text("Missing app origin", 400);
10
12
  const forwarded = {
11
13
  requestUrl: c.req.url,
12
14
  basePath,
13
15
  xForwardedProto,
14
16
  xForwardedHost,
15
- requestHostHeader
17
+ requestHostHeader,
18
+ appOrigin
16
19
  };
17
20
  const body = {
18
21
  redirect_uri: buildOAuthRedirectUriFromRequest(forwarded),
@@ -1 +1 @@
1
- {"version":3,"file":"cimd-public-routes.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/cimd-public-routes.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport type { JwkSet } from '../../types.ts';\nimport { getJwkThumbprint } from '../../utils/jwk-utils.ts';\nimport type { HubSpotConnectCimdClientDocument } from './cimd-client-metadata-types.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildHubSpotAppJwksUrlFromRequest,\n buildOAuthRedirectUriFromRequest,\n type BuildOAuthRedirectUriFromRequestOptions,\n} from './utils.ts';\n\nexport async function handleCimdClientJson(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n): Promise<Response> {\n const { cimdClientMetadata, basePath } = options;\n if (!cimdClientMetadata) {\n return c.text('CIMD client metadata is not configured', 500);\n }\n\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\n const forwarded: BuildOAuthRedirectUriFromRequestOptions = {\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n };\n\n const body: HubSpotConnectCimdClientDocument = {\n redirect_uri: buildOAuthRedirectUriFromRequest(forwarded),\n jwks_uri: buildHubSpotAppJwksUrlFromRequest(forwarded),\n scope: cimdClientMetadata.scope,\n };\n\n return c.text(JSON.stringify(body, null, 2), 200, {\n 'Content-Type': 'application/json; charset=utf-8',\n });\n}\n\nexport async function handleCimdAppJwks(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n): Promise<Response> {\n const { appKeys, hubspotConnectEnv } = options;\n if (!hubspotConnectEnv.isCimdEnabled) {\n return c.text('Not found', 404);\n }\n if (!appKeys) {\n return c.text('Missing app keys', 503);\n }\n\n const kid = await getJwkThumbprint({\n publicKeyJwk: appKeys.appPublicKeyJwk,\n });\n\n const jwk = {\n ...appKeys.appPublicKeyJwk,\n kid,\n use: 'sig',\n alg: 'ES256',\n key_ops: ['verify'],\n ext: true,\n } as JsonWebKey;\n\n const jwks: JwkSet = { keys: [jwk] };\n return c.json(jwks);\n}\n"],"mappings":";;;AAYA,eAAsB,qBACpB,GACA,SACmB;CACnB,MAAM,EAAE,oBAAoB,aAAa;CACzC,IAAI,CAAC,oBACH,OAAO,EAAE,KAAK,0CAA0C,IAAI;CAG9D,MAAM,kBAAkB,EAAE,IAAI,OAAO,oBAAoB,IAAI,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,mBAAmB,IAAI,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,OAAO,IAAI,KAAA;CAElD,MAAM,YAAqD;EACzD,YAAY,EAAE,IAAI;EAClB;EACA;EACA;EACA;EACD;CAED,MAAM,OAAyC;EAC7C,cAAc,iCAAiC,UAAU;EACzD,UAAU,kCAAkC,UAAU;EACtD,OAAO,mBAAmB;EAC3B;CAED,OAAO,EAAE,KAAK,KAAK,UAAU,MAAM,MAAM,EAAE,EAAE,KAAK,EAChD,gBAAgB,mCACjB,CAAC;;AAGJ,eAAsB,kBACpB,GACA,SACmB;CACnB,MAAM,EAAE,SAAS,sBAAsB;CACvC,IAAI,CAAC,kBAAkB,eACrB,OAAO,EAAE,KAAK,aAAa,IAAI;CAEjC,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,oBAAoB,IAAI;CAGxC,MAAM,MAAM,MAAM,iBAAiB,EACjC,cAAc,QAAQ,iBACvB,CAAC;CAWF,MAAM,OAAe,EAAE,MAAM,CAAC;EAR5B,GAAG,QAAQ;EACX;EACA,KAAK;EACL,KAAK;EACL,SAAS,CAAC,SAAS;EACnB,KAAK;EAG0B,CAAC,EAAE;CACpC,OAAO,EAAE,KAAK,KAAK"}
1
+ {"version":3,"file":"cimd-public-routes.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/cimd-public-routes.ts"],"sourcesContent":["import type { Context } from 'hono';\n\nimport type { JwkSet } from '../../types.ts';\nimport { getJwkThumbprint } from '../../utils/jwk-utils.ts';\nimport type { HubSpotConnectCimdClientDocument } from './cimd-client-metadata-types.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\nimport {\n buildHubSpotAppJwksUrlFromRequest,\n buildOAuthRedirectUriFromRequest,\n type BuildOAuthRedirectUriFromRequestOptions,\n} from './utils.ts';\n\nexport async function handleCimdClientJson(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n): Promise<Response> {\n const { cimdClientMetadata, basePath } = options;\n if (!cimdClientMetadata) {\n return c.text('CIMD client metadata is not configured', 500);\n }\n\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 appOrigin = c.req.query('app_origin');\n if (!appOrigin) {\n return c.text('Missing app origin', 400);\n }\n const forwarded: BuildOAuthRedirectUriFromRequestOptions = {\n requestUrl: c.req.url,\n basePath,\n xForwardedProto,\n xForwardedHost,\n requestHostHeader,\n appOrigin,\n };\n\n const body: HubSpotConnectCimdClientDocument = {\n redirect_uri: buildOAuthRedirectUriFromRequest(forwarded),\n jwks_uri: buildHubSpotAppJwksUrlFromRequest(forwarded),\n scope: cimdClientMetadata.scope,\n };\n\n return c.text(JSON.stringify(body, null, 2), 200, {\n 'Content-Type': 'application/json; charset=utf-8',\n });\n}\n\nexport async function handleCimdAppJwks(\n c: Context,\n options: HubSpotConnectOAuthRouteOptions\n): Promise<Response> {\n const { appKeys, hubspotConnectEnv } = options;\n if (!hubspotConnectEnv.isCimdEnabled) {\n return c.text('Not found', 404);\n }\n if (!appKeys) {\n return c.text('Missing app keys', 503);\n }\n\n const kid = await getJwkThumbprint({\n publicKeyJwk: appKeys.appPublicKeyJwk,\n });\n\n const jwk = {\n ...appKeys.appPublicKeyJwk,\n kid,\n use: 'sig',\n alg: 'ES256',\n key_ops: ['verify'],\n ext: true,\n } as JsonWebKey;\n\n const jwks: JwkSet = { keys: [jwk] };\n return c.json(jwks);\n}\n"],"mappings":";;;AAYA,eAAsB,qBACpB,GACA,SACmB;CACnB,MAAM,EAAE,oBAAoB,aAAa;CACzC,IAAI,CAAC,oBACH,OAAO,EAAE,KAAK,0CAA0C,GAAG;CAG7D,MAAM,kBAAkB,EAAE,IAAI,OAAO,mBAAmB,KAAK,KAAA;CAC7D,MAAM,iBAAiB,EAAE,IAAI,OAAO,kBAAkB,KAAK,KAAA;CAC3D,MAAM,oBAAoB,EAAE,IAAI,OAAO,MAAM,KAAK,KAAA;CAClD,MAAM,YAAY,EAAE,IAAI,MAAM,YAAY;CAC1C,IAAI,CAAC,WACH,OAAO,EAAE,KAAK,sBAAsB,GAAG;CAEzC,MAAM,YAAqD;EACzD,YAAY,EAAE,IAAI;EAClB;EACA;EACA;EACA;EACA;CACF;CAEA,MAAM,OAAyC;EAC7C,cAAc,iCAAiC,SAAS;EACxD,UAAU,kCAAkC,SAAS;EACrD,OAAO,mBAAmB;CAC5B;CAEA,OAAO,EAAE,KAAK,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,KAAK,EAChD,gBAAgB,kCAClB,CAAC;AACH;AAEA,eAAsB,kBACpB,GACA,SACmB;CACnB,MAAM,EAAE,SAAS,sBAAsB;CACvC,IAAI,CAAC,kBAAkB,eACrB,OAAO,EAAE,KAAK,aAAa,GAAG;CAEhC,IAAI,CAAC,SACH,OAAO,EAAE,KAAK,oBAAoB,GAAG;CAGvC,MAAM,MAAM,MAAM,iBAAiB,EACjC,cAAc,QAAQ,gBACxB,CAAC;CAWD,MAAM,OAAe,EAAE,MAAM,CAAC;EAR5B,GAAG,QAAQ;EACX;EACA,KAAK;EACL,KAAK;EACL,SAAS,CAAC,QAAQ;EAClB,KAAK;CAGyB,CAAC,EAAE;CACnC,OAAO,EAAE,KAAK,IAAI;AACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-hubspot-client-metadata.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.ts"],"sourcesContent":["import type { HubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\n\nexport interface DeriveHubSpotAuthorizeScopesFromClientMetadataSuccess {\n ok: true;\n scope: string;\n optionalScope?: string;\n}\n\nexport interface DeriveHubSpotAuthorizeScopesFromClientMetadataFailure {\n ok: false;\n status: number;\n message: string;\n}\n\nexport type DeriveHubSpotAuthorizeScopesFromClientMetadataResult =\n | DeriveHubSpotAuthorizeScopesFromClientMetadataSuccess\n | DeriveHubSpotAuthorizeScopesFromClientMetadataFailure;\n\n/**\n * Builds `scope` and `optional_scope` query values for HubSpot\n * `/oauth/authorize` from in-memory client metadata (same shape as\n * `HubSpotConnectCimdClientMetadata` / `startHubSpotConnectFunction({ client })`).\n */\nexport function deriveHubSpotAuthorizeScopesFromClientMetadata(\n metadata: HubSpotConnectCimdClientMetadata\n): DeriveHubSpotAuthorizeScopesFromClientMetadataResult {\n const required = metadata.scope?.required;\n const requiredOk =\n Array.isArray(required) &&\n required.length > 0 &&\n required.every((s) => typeof s === 'string' && s.length > 0);\n\n if (!requiredOk) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid or empty scope.required in client metadata',\n };\n }\n\n const scope = required.join(' ');\n\n const optionalRaw = metadata.scope.optional;\n if (optionalRaw == null) {\n return { ok: true, scope };\n }\n\n if (!Array.isArray(optionalRaw)) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid scope.optional in client metadata',\n };\n }\n\n if (optionalRaw.length === 0) {\n return { ok: true, scope };\n }\n\n if (!optionalRaw.every((s) => typeof s === 'string' && s.length > 0)) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid scope.optional in client metadata',\n };\n }\n\n return {\n ok: true,\n scope,\n optionalScope: optionalRaw.join(' '),\n };\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,+CACd,UACsD;CACtD,MAAM,WAAW,SAAS,OAAO;CAMjC,IAAI,EAJF,MAAM,QAAQ,SAAS,IACvB,SAAS,SAAS,KAClB,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,EAAE,GAG5D,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACV;CAGH,MAAM,QAAQ,SAAS,KAAK,IAAI;CAEhC,MAAM,cAAc,SAAS,MAAM;CACnC,IAAI,eAAe,MACjB,OAAO;EAAE,IAAI;EAAM;EAAO;CAG5B,IAAI,CAAC,MAAM,QAAQ,YAAY,EAC7B,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACV;CAGH,IAAI,YAAY,WAAW,GACzB,OAAO;EAAE,IAAI;EAAM;EAAO;CAG5B,IAAI,CAAC,YAAY,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,EAAE,EAClE,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACV;CAGH,OAAO;EACL,IAAI;EACJ;EACA,eAAe,YAAY,KAAK,IAAI;EACrC"}
1
+ {"version":3,"file":"fetch-hubspot-client-metadata.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.ts"],"sourcesContent":["import type { HubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\n\nexport interface DeriveHubSpotAuthorizeScopesFromClientMetadataSuccess {\n ok: true;\n scope: string;\n optionalScope?: string;\n}\n\nexport interface DeriveHubSpotAuthorizeScopesFromClientMetadataFailure {\n ok: false;\n status: number;\n message: string;\n}\n\nexport type DeriveHubSpotAuthorizeScopesFromClientMetadataResult =\n | DeriveHubSpotAuthorizeScopesFromClientMetadataSuccess\n | DeriveHubSpotAuthorizeScopesFromClientMetadataFailure;\n\n/**\n * Builds `scope` and `optional_scope` query values for HubSpot\n * `/oauth/authorize` from in-memory client metadata (same shape as\n * `HubSpotConnectCimdClientMetadata` / `startHubSpotConnectFunction({ client })`).\n */\nexport function deriveHubSpotAuthorizeScopesFromClientMetadata(\n metadata: HubSpotConnectCimdClientMetadata\n): DeriveHubSpotAuthorizeScopesFromClientMetadataResult {\n const required = metadata.scope?.required;\n const requiredOk =\n Array.isArray(required) &&\n required.length > 0 &&\n required.every((s) => typeof s === 'string' && s.length > 0);\n\n if (!requiredOk) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid or empty scope.required in client metadata',\n };\n }\n\n const scope = required.join(' ');\n\n const optionalRaw = metadata.scope.optional;\n if (optionalRaw == null) {\n return { ok: true, scope };\n }\n\n if (!Array.isArray(optionalRaw)) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid scope.optional in client metadata',\n };\n }\n\n if (optionalRaw.length === 0) {\n return { ok: true, scope };\n }\n\n if (!optionalRaw.every((s) => typeof s === 'string' && s.length > 0)) {\n return {\n ok: false,\n status: 500,\n message: 'Invalid scope.optional in client metadata',\n };\n }\n\n return {\n ok: true,\n scope,\n optionalScope: optionalRaw.join(' '),\n };\n}\n"],"mappings":";;;;;;AAuBA,SAAgB,+CACd,UACsD;CACtD,MAAM,WAAW,SAAS,OAAO;CAMjC,IAAI,EAJF,MAAM,QAAQ,QAAQ,KACtB,SAAS,SAAS,KAClB,SAAS,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,IAG3D,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;CACX;CAGF,MAAM,QAAQ,SAAS,KAAK,GAAG;CAE/B,MAAM,cAAc,SAAS,MAAM;CACnC,IAAI,eAAe,MACjB,OAAO;EAAE,IAAI;EAAM;CAAM;CAG3B,IAAI,CAAC,MAAM,QAAQ,WAAW,GAC5B,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;CACX;CAGF,IAAI,YAAY,WAAW,GACzB,OAAO;EAAE,IAAI;EAAM;CAAM;CAG3B,IAAI,CAAC,YAAY,OAAO,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,GACjE,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;CACX;CAGF,OAAO;EACL,IAAI;EACJ;EACA,eAAe,YAAY,KAAK,GAAG;CACrC;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { assertHubSpotConnectCimdClientMetadata } from "./cimd-client-metadata-types.js";
2
2
  import { noopLogger } from "../../shared/logger.js";
3
- import { handleAuthCallback } from "./auth-callback.js";
3
+ import { corsMiddleware } from "../utils/cors-middleware.js";
4
+ import { handleAuthComplete } from "./auth-complete.js";
4
5
  import { handleAuthInitSession } from "./auth-init-session.js";
5
6
  import { handleAuthLogout } from "./auth-logout.js";
6
7
  import { handleAuthRefresh } from "./auth-refresh.js";
@@ -22,10 +23,11 @@ function registerHubSpotConnectRoutes(options) {
22
23
  hubspotConnectEnv,
23
24
  cimdClientMetadata
24
25
  };
26
+ app.use("*", corsMiddleware());
25
27
  app.get("/client.json", (c) => handleCimdClientJson(c, oauthRouteOptions));
26
28
  if (hubspotConnectEnv.isCimdEnabled) app.get("/jwks.json", (c) => handleCimdAppJwks(c, oauthRouteOptions));
27
29
  app.get("/auth/init-session", (c) => handleAuthInitSession(c, oauthRouteOptions));
28
- app.get("/auth/callback", (c) => handleAuthCallback(c, oauthRouteOptions));
30
+ app.post("/auth/complete", (c) => handleAuthComplete(c, oauthRouteOptions));
29
31
  app.post("/auth/refresh", (c) => handleAuthRefresh(c, oauthRouteOptions));
30
32
  app.post("/auth/logout", (c) => handleAuthLogout(c, oauthRouteOptions));
31
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hubspot-connect-routes.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { noopLogger, type Logger } from '../../../shared/logger.ts';\nimport type { AppKeys } from '../../types.ts';\nimport { handleAuthCallback } from './auth-callback.ts';\nimport { handleAuthInitSession } from './auth-init-session.ts';\nimport { handleAuthLogout } from './auth-logout.ts';\nimport { handleAuthRefresh } from './auth-refresh.ts';\nimport { assertHubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\nimport type { HubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\nimport {\n handleCimdAppJwks,\n handleCimdClientJson,\n} from './cimd-public-routes.ts';\nimport type { HubSpotConnectRoutesEnv } from './load-hubspot-connect-routes-env.ts';\n\n/**\n * Options accepted by {@link registerHubSpotConnectRoutes}.\n */\nexport interface RegisterHubSpotConnectRoutesOptions {\n /** The Hono app to mount the OAuth routes on. */\n app: Hono;\n /**\n * Imported app keys from `secureStart`, or `null` when CIMD and DPoP\n * are both disabled.\n */\n appKeys: AppKeys | null;\n /**\n * Path the routes are mounted under (no trailing slash). Used to\n * scope refresh-token cookies via `Path=${basePath}/auth`.\n */\n basePath: string;\n /**\n * OAuth and client-mode settings, typically from\n * {@link loadHubSpotConnectRoutesEnv}.\n */\n hubspotConnectEnv: HubSpotConnectRoutesEnv;\n /**\n * Scope configuration for `GET /client.json` and for authorize URL\n * scopes when CIMD is off. Always required.\n */\n cimdClientMetadata: HubSpotConnectCimdClientMetadata;\n /**\n * Optional logger. When omitted the SDK uses a no-op logger so\n * server-side state never leaks into the host application's\n * console.\n */\n logger?: Logger;\n}\n\n/**\n * Mounts hubspot-connect routes: OAuth (`/auth/...`); `GET /client.json`\n * from `cimdClientMetadata`; `GET /jwks.json` when CIMD is enabled.\n */\nexport function registerHubSpotConnectRoutes(\n options: RegisterHubSpotConnectRoutesOptions\n): void {\n const {\n app,\n appKeys,\n basePath,\n hubspotConnectEnv,\n cimdClientMetadata,\n logger = noopLogger,\n } = options;\n\n if (!cimdClientMetadata) {\n throw new Error(\n 'registerHubSpotConnectRoutes: cimdClientMetadata is required'\n );\n }\n assertHubSpotConnectCimdClientMetadata(cimdClientMetadata);\n\n const refreshCookiePath = `${basePath}/auth`;\n const oauthRouteOptions = {\n appKeys,\n refreshCookiePath,\n logger,\n basePath,\n hubspotConnectEnv,\n cimdClientMetadata,\n };\n\n app.get('/client.json', (c) => handleCimdClientJson(c, oauthRouteOptions));\n if (hubspotConnectEnv.isCimdEnabled) {\n app.get('/jwks.json', (c) => handleCimdAppJwks(c, oauthRouteOptions));\n }\n\n app.get('/auth/init-session', (c) =>\n handleAuthInitSession(c, oauthRouteOptions)\n );\n app.get('/auth/callback', (c) => handleAuthCallback(c, oauthRouteOptions));\n app.post('/auth/refresh', (c) => handleAuthRefresh(c, oauthRouteOptions));\n app.post('/auth/logout', (c) => handleAuthLogout(c, oauthRouteOptions));\n}\n"],"mappings":";;;;;;;;;;;;AAsDA,SAAgB,6BACd,SACM;CACN,MAAM,EACJ,KACA,SACA,UACA,mBACA,oBACA,SAAS,eACP;CAEJ,IAAI,CAAC,oBACH,MAAM,IAAI,MACR,+DACD;CAEH,uCAAuC,mBAAmB;CAG1D,MAAM,oBAAoB;EACxB;EACA,mBAAA,GAH2B,SAAS;EAIpC;EACA;EACA;EACA;EACD;CAED,IAAI,IAAI,iBAAiB,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;CAC1E,IAAI,kBAAkB,eACpB,IAAI,IAAI,eAAe,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;CAGvE,IAAI,IAAI,uBAAuB,MAC7B,sBAAsB,GAAG,kBAAkB,CAC5C;CACD,IAAI,IAAI,mBAAmB,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;CAC1E,IAAI,KAAK,kBAAkB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;CACzE,IAAI,KAAK,iBAAiB,MAAM,iBAAiB,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"hubspot-connect-routes.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { noopLogger, type Logger } from '../../../shared/logger.ts';\nimport type { AppKeys } from '../../types.ts';\nimport { corsMiddleware } from '../utils/cors-middleware.ts';\nimport { handleAuthComplete } from './auth-complete.ts';\nimport { handleAuthInitSession } from './auth-init-session.ts';\nimport { handleAuthLogout } from './auth-logout.ts';\nimport { handleAuthRefresh } from './auth-refresh.ts';\nimport { assertHubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\nimport type { HubSpotConnectCimdClientMetadata } from './cimd-client-metadata-types.ts';\nimport {\n handleCimdAppJwks,\n handleCimdClientJson,\n} from './cimd-public-routes.ts';\nimport type { HubSpotConnectRoutesEnv } from './load-hubspot-connect-routes-env.ts';\nimport type { HubSpotConnectOAuthRouteOptions } from './types.ts';\n\n/**\n * Options accepted by {@link registerHubSpotConnectRoutes}.\n */\nexport interface RegisterHubSpotConnectRoutesOptions {\n /** The Hono app to mount the OAuth routes on. */\n app: Hono;\n /**\n * Imported app keys from `secureStart`, or `null` when CIMD and DPoP\n * are both disabled.\n */\n appKeys: AppKeys | null;\n /**\n * Path the routes are mounted under (no trailing slash). Used to\n * scope refresh-token cookies via `Path=${basePath}/auth`.\n */\n basePath: string;\n /**\n * OAuth and client-mode settings, typically from\n * {@link loadHubSpotConnectRoutesEnv}.\n */\n hubspotConnectEnv: HubSpotConnectRoutesEnv;\n /**\n * Scope configuration for `GET /client.json` and for authorize URL\n * scopes when CIMD is off. Always required.\n */\n cimdClientMetadata: HubSpotConnectCimdClientMetadata;\n /**\n * Optional logger. When omitted the SDK uses a no-op logger so\n * server-side state never leaks into the host application's\n * console.\n */\n logger?: Logger;\n}\n\n/**\n * Mounts hubspot-connect routes: OAuth (`/auth/...`); `GET /client.json`\n * from `cimdClientMetadata`; `GET /jwks.json` when CIMD is enabled.\n */\nexport function registerHubSpotConnectRoutes(\n options: RegisterHubSpotConnectRoutesOptions\n): void {\n const {\n app,\n appKeys,\n basePath,\n hubspotConnectEnv,\n cimdClientMetadata,\n logger = noopLogger,\n } = options;\n\n if (!cimdClientMetadata) {\n throw new Error(\n 'registerHubSpotConnectRoutes: cimdClientMetadata is required'\n );\n }\n assertHubSpotConnectCimdClientMetadata(cimdClientMetadata);\n\n const refreshCookiePath = `${basePath}/auth`;\n const oauthRouteOptions: HubSpotConnectOAuthRouteOptions = {\n appKeys,\n refreshCookiePath,\n logger,\n basePath,\n hubspotConnectEnv,\n cimdClientMetadata,\n };\n\n // Credentialed CORS for the cross-origin Lovable / Supabase shape.\n // Echoes the request `Origin` (or the pinned `__Host-hs_app_origin`\n // cookie value once init-session has run) and short-circuits OPTIONS\n // preflights with a 204 before any route handler runs.\n app.use('*', corsMiddleware());\n\n app.get('/client.json', (c) => handleCimdClientJson(c, oauthRouteOptions));\n if (hubspotConnectEnv.isCimdEnabled) {\n app.get('/jwks.json', (c) => handleCimdAppJwks(c, oauthRouteOptions));\n }\n\n app.get('/auth/init-session', (c) =>\n handleAuthInitSession(c, oauthRouteOptions)\n );\n app.post('/auth/complete', (c) => handleAuthComplete(c, oauthRouteOptions));\n app.post('/auth/refresh', (c) => handleAuthRefresh(c, oauthRouteOptions));\n app.post('/auth/logout', (c) => handleAuthLogout(c, oauthRouteOptions));\n}\n"],"mappings":";;;;;;;;;;;;;AAwDA,SAAgB,6BACd,SACM;CACN,MAAM,EACJ,KACA,SACA,UACA,mBACA,oBACA,SAAS,eACP;CAEJ,IAAI,CAAC,oBACH,MAAM,IAAI,MACR,8DACF;CAEF,uCAAuC,kBAAkB;CAGzD,MAAM,oBAAqD;EACzD;EACA,mBAAA,GAH2B,SAAS;EAIpC;EACA;EACA;EACA;CACF;CAMA,IAAI,IAAI,KAAK,eAAe,CAAC;CAE7B,IAAI,IAAI,iBAAiB,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;CACzE,IAAI,kBAAkB,eACpB,IAAI,IAAI,eAAe,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;CAGtE,IAAI,IAAI,uBAAuB,MAC7B,sBAAsB,GAAG,iBAAiB,CAC5C;CACA,IAAI,KAAK,mBAAmB,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;CAC1E,IAAI,KAAK,kBAAkB,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;CACxE,IAAI,KAAK,iBAAiB,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AACxE"}
@@ -1,4 +1,4 @@
1
- import { isHubspotCimdEnabled, isHubspotDpopEnabled, requireEnv } from "../../utils/env-utils.js";
1
+ import { getHubSpotAuthorizationEndpoint, getHubSpotOAuthApiOrigin, isHubspotCimdEnabled, isHubspotDpopEnabled, requireHubSpotClientId, requireHubSpotClientSecret } from "../../utils/env-utils.js";
2
2
  //#region src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts
3
3
  /**
4
4
  * Reads hubspot-connect environment variables from `process.env` or
@@ -6,8 +6,8 @@ import { isHubspotCimdEnabled, isHubspotDpopEnabled, requireEnv } from "../../ut
6
6
  * {@link registerHubSpotConnectRoutes}.
7
7
  */
8
8
  function loadHubSpotConnectRoutesEnv() {
9
- const hubspotAuthorizationEndpoint = requireEnv("HUBSPOT_AUTHORIZATION_ENDPOINT");
10
- const hubspotOAuthApiOrigin = new URL(requireEnv("HUBSPOT_OAUTH_API_ORIGIN")).origin;
9
+ const hubspotAuthorizationEndpoint = getHubSpotAuthorizationEndpoint();
10
+ const hubspotOAuthApiOrigin = getHubSpotOAuthApiOrigin();
11
11
  const isCimdEnabled = isHubspotCimdEnabled();
12
12
  const isDpopEnabled = isHubspotDpopEnabled();
13
13
  const isAppPrivateKeyRequired = isCimdEnabled || isDpopEnabled;
@@ -24,8 +24,8 @@ function loadHubSpotConnectRoutesEnv() {
24
24
  isCimdEnabled: false,
25
25
  isDpopEnabled,
26
26
  isAppPrivateKeyRequired,
27
- hubspotClientId: requireEnv("HUBSPOT_CLIENT_ID"),
28
- hubspotClientSecret: requireEnv("HUBSPOT_CLIENT_SECRET")
27
+ hubspotClientId: requireHubSpotClientId(),
28
+ hubspotClientSecret: requireHubSpotClientSecret()
29
29
  };
30
30
  }
31
31
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"load-hubspot-connect-routes-env.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts"],"sourcesContent":["import {\n isHubspotCimdEnabled,\n isHubspotDpopEnabled,\n requireEnv,\n} from '../../utils/env-utils.ts';\n\n/**\n * HubSpot OAuth and client-mode settings read once for hubspot-connect\n * routes. Built by {@link loadHubSpotConnectRoutesEnv}.\n */\nexport type HubSpotConnectRoutesEnv =\n | HubSpotConnectRoutesEnvCimd\n | HubSpotConnectRoutesEnvClientSecret;\n\nexport interface HubSpotConnectRoutesEnvCimd {\n hubspotAuthorizationEndpoint: string;\n hubspotOAuthApiOrigin: string;\n isCimdEnabled: true;\n isDpopEnabled: boolean;\n isAppPrivateKeyRequired: boolean;\n}\n\nexport interface HubSpotConnectRoutesEnvClientSecret {\n hubspotAuthorizationEndpoint: string;\n hubspotOAuthApiOrigin: string;\n isCimdEnabled: false;\n isDpopEnabled: boolean;\n isAppPrivateKeyRequired: boolean;\n hubspotClientId: string;\n hubspotClientSecret: string;\n}\n\n/**\n * Reads hubspot-connect environment variables from `process.env` or\n * `Deno.env` and returns a typed object for\n * {@link registerHubSpotConnectRoutes}.\n */\nexport function loadHubSpotConnectRoutesEnv(): HubSpotConnectRoutesEnv {\n const hubspotAuthorizationEndpoint = requireEnv(\n 'HUBSPOT_AUTHORIZATION_ENDPOINT'\n );\n const hubspotOAuthApiOrigin = new URL(requireEnv('HUBSPOT_OAUTH_API_ORIGIN'))\n .origin;\n const isCimdEnabled = isHubspotCimdEnabled();\n const isDpopEnabled = isHubspotDpopEnabled();\n const isAppPrivateKeyRequired = isCimdEnabled || isDpopEnabled;\n\n if (isCimdEnabled) {\n return {\n hubspotAuthorizationEndpoint,\n hubspotOAuthApiOrigin,\n isCimdEnabled: true,\n isDpopEnabled,\n isAppPrivateKeyRequired,\n };\n }\n\n return {\n hubspotAuthorizationEndpoint,\n hubspotOAuthApiOrigin,\n isCimdEnabled: false,\n isDpopEnabled,\n isAppPrivateKeyRequired,\n hubspotClientId: requireEnv('HUBSPOT_CLIENT_ID'),\n hubspotClientSecret: requireEnv('HUBSPOT_CLIENT_SECRET'),\n };\n}\n"],"mappings":";;;;;;;AAqCA,SAAgB,8BAAuD;CACrE,MAAM,+BAA+B,WACnC,iCACD;CACD,MAAM,wBAAwB,IAAI,IAAI,WAAW,2BAA2B,CAAC,CAC1E;CACH,MAAM,gBAAgB,sBAAsB;CAC5C,MAAM,gBAAgB,sBAAsB;CAC5C,MAAM,0BAA0B,iBAAiB;CAEjD,IAAI,eACF,OAAO;EACL;EACA;EACA,eAAe;EACf;EACA;EACD;CAGH,OAAO;EACL;EACA;EACA,eAAe;EACf;EACA;EACA,iBAAiB,WAAW,oBAAoB;EAChD,qBAAqB,WAAW,wBAAwB;EACzD"}
1
+ {"version":3,"file":"load-hubspot-connect-routes-env.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts"],"sourcesContent":["import {\n getHubSpotAuthorizationEndpoint,\n getHubSpotOAuthApiOrigin,\n isHubspotCimdEnabled,\n isHubspotDpopEnabled,\n requireHubSpotClientId,\n requireHubSpotClientSecret,\n} from '../../utils/env-utils.ts';\n\n/**\n * HubSpot OAuth and client-mode settings read once for hubspot-connect\n * routes. Built by {@link loadHubSpotConnectRoutesEnv}.\n */\nexport type HubSpotConnectRoutesEnv =\n | HubSpotConnectRoutesEnvCimd\n | HubSpotConnectRoutesEnvClientSecret;\n\nexport interface HubSpotConnectRoutesEnvCimd {\n hubspotAuthorizationEndpoint: string;\n hubspotOAuthApiOrigin: string;\n isCimdEnabled: true;\n isDpopEnabled: boolean;\n isAppPrivateKeyRequired: boolean;\n}\n\nexport interface HubSpotConnectRoutesEnvClientSecret {\n hubspotAuthorizationEndpoint: string;\n hubspotOAuthApiOrigin: string;\n isCimdEnabled: false;\n isDpopEnabled: boolean;\n isAppPrivateKeyRequired: boolean;\n hubspotClientId: string;\n hubspotClientSecret: string;\n}\n\n/**\n * Reads hubspot-connect environment variables from `process.env` or\n * `Deno.env` and returns a typed object for\n * {@link registerHubSpotConnectRoutes}.\n */\nexport function loadHubSpotConnectRoutesEnv(): HubSpotConnectRoutesEnv {\n const hubspotAuthorizationEndpoint = getHubSpotAuthorizationEndpoint();\n const hubspotOAuthApiOrigin = getHubSpotOAuthApiOrigin();\n const isCimdEnabled = isHubspotCimdEnabled();\n const isDpopEnabled = isHubspotDpopEnabled();\n const isAppPrivateKeyRequired = isCimdEnabled || isDpopEnabled;\n\n if (isCimdEnabled) {\n return {\n hubspotAuthorizationEndpoint,\n hubspotOAuthApiOrigin,\n isCimdEnabled: true,\n isDpopEnabled,\n isAppPrivateKeyRequired,\n };\n }\n\n return {\n hubspotAuthorizationEndpoint,\n hubspotOAuthApiOrigin,\n isCimdEnabled: false,\n isDpopEnabled,\n isAppPrivateKeyRequired,\n hubspotClientId: requireHubSpotClientId(),\n hubspotClientSecret: requireHubSpotClientSecret(),\n };\n}\n"],"mappings":";;;;;;;AAwCA,SAAgB,8BAAuD;CACrE,MAAM,+BAA+B,gCAAgC;CACrE,MAAM,wBAAwB,yBAAyB;CACvD,MAAM,gBAAgB,qBAAqB;CAC3C,MAAM,gBAAgB,qBAAqB;CAC3C,MAAM,0BAA0B,iBAAiB;CAEjD,IAAI,eACF,OAAO;EACL;EACA;EACA,eAAe;EACf;EACA;CACF;CAGF,OAAO;EACL;EACA;EACA,eAAe;EACf;EACA;EACA,iBAAiB,uBAAuB;EACxC,qBAAqB,2BAA2B;CAClD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-client.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/oauth-client.ts"],"sourcesContent":["import type { AppKeys } from '../../types.ts';\nimport { signDpopProof } from '../../utils/dpop-utils.ts';\nimport { signJwt } from '../../utils/jwt-utils.ts';\n\n/**\n * Lifetime of the OAuth `client_assertion` JWT in seconds. Short by\n * design — RFC 7521 recommends short-lived assertions, and HubSpot's\n * authorization server rejects assertions older than ~5 minutes.\n */\nconst CLIENT_ASSERTION_TTL_SEC = 60;\n\n/**\n * The `client_assertion_type` value mandated by RFC 7523 §2.2 for\n * JWT-bearer client authentication.\n */\nconst JWT_BEARER_ASSERTION_TYPE =\n 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';\n\n/**\n * Wire shape of a HubSpot OAuth token-endpoint success response.\n */\nexport interface OAuthTokenResponse {\n /** New DPoP-bound access token (sender-constrained). */\n access_token: string;\n /** New refresh token, opaque to the client. */\n refresh_token: string;\n /** Lifetime of `access_token` in seconds. */\n expires_in: number;\n}\n\nexport interface BuildClientAssertionOptions {\n appKeys: AppKeys;\n /** Client ID URL — used as both `iss` and `sub`. */\n clientId: string;\n /** Token-endpoint URL — used as `aud`. */\n audience: string;\n}\n\n/**\n * Mints a short-lived ES256 JWT used as the `client_assertion`\n * parameter when calling HubSpot's token endpoint, per RFC 7523.\n */\nexport async function buildClientAssertion(\n options: BuildClientAssertionOptions\n): Promise<string> {\n const { appKeys, clientId, audience } = options;\n return signJwt({\n privateKey: appKeys.appPrivateKey,\n payload: {\n iss: clientId,\n sub: clientId,\n aud: audience,\n jti: crypto.randomUUID(),\n },\n ttlSeconds: CLIENT_ASSERTION_TTL_SEC,\n });\n}\n\nexport interface BuildTokenEndpointDpopProofOptions {\n appKeys: AppKeys;\n /** Token-endpoint URL — used as the DPoP `htu` claim. */\n tokenEndpointUrl: string;\n /** Hash of the app session ID — used as the DPoP `sid` claim. */\n sessionIdHash: string;\n}\n\n/**\n * Signs a DPoP proof for a `POST` to HubSpot's token endpoint. RFC 9449\n * binds the resulting access token to the proving public key so that\n * later API calls must come from the same key holder.\n */\nexport async function buildTokenEndpointDpopProof(\n options: BuildTokenEndpointDpopProofOptions\n): Promise<string> {\n const { appKeys, tokenEndpointUrl, sessionIdHash } = options;\n return signDpopProof({\n appKeys,\n claims: {\n htm: 'POST',\n htu: tokenEndpointUrl,\n jti: crypto.randomUUID(),\n iat: Math.floor(Date.now() / 1000),\n sid: sessionIdHash,\n },\n });\n}\n\nexport interface RequestOAuthTokenOptions {\n tokenEndpointUrl: string;\n /** Body parameters; serialized to `application/x-www-form-urlencoded`. */\n formParams: Record<string, string>;\n /**\n * When true, a `DPoP` header is required and `dpopProof` must be set.\n */\n isDpopEnabled: boolean;\n /**\n * DPoP proof for this request; required when `isDpopEnabled` is true.\n */\n dpopProof?: string;\n}\n\nexport interface RequestOAuthTokenSuccess {\n ok: true;\n body: OAuthTokenResponse;\n}\n\nexport interface RequestOAuthTokenFailure {\n ok: false;\n /** HTTP status returned by the upstream endpoint. */\n status: number;\n /** Error body as text — used to compose the SDK's error response. */\n errorText: string;\n}\n\nexport type RequestOAuthTokenResult =\n | RequestOAuthTokenSuccess\n | RequestOAuthTokenFailure;\n\n/**\n * POSTs an `application/x-www-form-urlencoded` body to a HubSpot token\n * endpoint. Attaches a `DPoP` header when `isDpopEnabled` is true and\n * `dpopProof` is provided. Reads the response once — either\n * as JSON on success or as text on failure — so callers never have to\n * consume the body twice.\n */\nexport async function requestOAuthToken(\n options: RequestOAuthTokenOptions\n): Promise<RequestOAuthTokenResult> {\n const { tokenEndpointUrl, formParams, dpopProof, isDpopEnabled } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n if (isDpopEnabled) {\n if (!dpopProof) {\n throw new Error('DPoP proof is required when DPoP is enabled');\n }\n headers.DPoP = dpopProof;\n }\n const tokenResponse = await fetch(tokenEndpointUrl, {\n method: 'POST',\n headers,\n body: new URLSearchParams(formParams),\n });\n if (!tokenResponse.ok) {\n const errorText = await tokenResponse.text();\n return { ok: false, status: tokenResponse.status, errorText };\n }\n const body = (await tokenResponse.json()) as OAuthTokenResponse;\n return { ok: true, body };\n}\n\n/**\n * Form parameters always present on the OAuth `client_assertion` flow.\n * Spread into the call site's `formParams`.\n */\nexport function buildClientAssertionFormParams(input: {\n clientId: string;\n clientAssertion: string;\n}): Record<string, string> {\n const { clientId, clientAssertion } = input;\n return {\n client_id: clientId,\n client_assertion_type: JWT_BEARER_ASSERTION_TYPE,\n client_assertion: clientAssertion,\n };\n}\n\nexport interface BuildClientSecretFormParamsOptions {\n clientId: string;\n clientSecret: string;\n}\n\nexport function buildClientSecretFormParams(\n options: BuildClientSecretFormParamsOptions\n): Record<string, string> {\n const { clientId, clientSecret } = options;\n return {\n client_id: clientId,\n client_secret: clientSecret,\n };\n}\n"],"mappings":";;;;;;;;AASA,MAAM,2BAA2B;;;;;AAMjC,MAAM,4BACJ;;;;;AA0BF,eAAsB,qBACpB,SACiB;CACjB,MAAM,EAAE,SAAS,UAAU,aAAa;CACxC,OAAO,QAAQ;EACb,YAAY,QAAQ;EACpB,SAAS;GACP,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,OAAO,YAAY;GACzB;EACD,YAAY;EACb,CAAC;;;;;;;AAgBJ,eAAsB,4BACpB,SACiB;CACjB,MAAM,EAAE,SAAS,kBAAkB,kBAAkB;CACrD,OAAO,cAAc;EACnB;EACA,QAAQ;GACN,KAAK;GACL,KAAK;GACL,KAAK,OAAO,YAAY;GACxB,KAAK,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;GAClC,KAAK;GACN;EACF,CAAC;;;;;;;;;AAyCJ,eAAsB,kBACpB,SACkC;CAClC,MAAM,EAAE,kBAAkB,YAAY,WAAW,kBAAkB;CACnE,MAAM,UAAkC,EACtC,gBAAgB,qCACjB;CACD,IAAI,eAAe;EACjB,IAAI,CAAC,WACH,MAAM,IAAI,MAAM,8CAA8C;EAEhE,QAAQ,OAAO;;CAEjB,MAAM,gBAAgB,MAAM,MAAM,kBAAkB;EAClD,QAAQ;EACR;EACA,MAAM,IAAI,gBAAgB,WAAW;EACtC,CAAC;CACF,IAAI,CAAC,cAAc,IAAI;EACrB,MAAM,YAAY,MAAM,cAAc,MAAM;EAC5C,OAAO;GAAE,IAAI;GAAO,QAAQ,cAAc;GAAQ;GAAW;;CAG/D,OAAO;EAAE,IAAI;EAAM,MAAA,MADC,cAAc,MAAM;EACf;;;;;;AAO3B,SAAgB,+BAA+B,OAGpB;CACzB,MAAM,EAAE,UAAU,oBAAoB;CACtC,OAAO;EACL,WAAW;EACX,uBAAuB;EACvB,kBAAkB;EACnB;;AAQH,SAAgB,4BACd,SACwB;CACxB,MAAM,EAAE,UAAU,iBAAiB;CACnC,OAAO;EACL,WAAW;EACX,eAAe;EAChB"}
1
+ {"version":3,"file":"oauth-client.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/oauth-client.ts"],"sourcesContent":["import type { AppKeys } from '../../types.ts';\nimport { signDpopProof } from '../../utils/dpop-utils.ts';\nimport { signJwt } from '../../utils/jwt-utils.ts';\n\n/**\n * Lifetime of the OAuth `client_assertion` JWT in seconds. Short by\n * design — RFC 7521 recommends short-lived assertions, and HubSpot's\n * authorization server rejects assertions older than ~5 minutes.\n */\nconst CLIENT_ASSERTION_TTL_SEC = 60;\n\n/**\n * The `client_assertion_type` value mandated by RFC 7523 §2.2 for\n * JWT-bearer client authentication.\n */\nconst JWT_BEARER_ASSERTION_TYPE =\n 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';\n\n/**\n * Wire shape of a HubSpot OAuth token-endpoint success response.\n */\nexport interface OAuthTokenResponse {\n /** New DPoP-bound access token (sender-constrained). */\n access_token: string;\n /** New refresh token, opaque to the client. */\n refresh_token: string;\n /** Lifetime of `access_token` in seconds. */\n expires_in: number;\n}\n\nexport interface BuildClientAssertionOptions {\n appKeys: AppKeys;\n /** Client ID URL — used as both `iss` and `sub`. */\n clientId: string;\n /** Token-endpoint URL — used as `aud`. */\n audience: string;\n}\n\n/**\n * Mints a short-lived ES256 JWT used as the `client_assertion`\n * parameter when calling HubSpot's token endpoint, per RFC 7523.\n */\nexport async function buildClientAssertion(\n options: BuildClientAssertionOptions\n): Promise<string> {\n const { appKeys, clientId, audience } = options;\n return signJwt({\n privateKey: appKeys.appPrivateKey,\n payload: {\n iss: clientId,\n sub: clientId,\n aud: audience,\n jti: crypto.randomUUID(),\n },\n ttlSeconds: CLIENT_ASSERTION_TTL_SEC,\n });\n}\n\nexport interface BuildTokenEndpointDpopProofOptions {\n appKeys: AppKeys;\n /** Token-endpoint URL — used as the DPoP `htu` claim. */\n tokenEndpointUrl: string;\n /** Hash of the app session ID — used as the DPoP `sid` claim. */\n sessionIdHash: string;\n}\n\n/**\n * Signs a DPoP proof for a `POST` to HubSpot's token endpoint. RFC 9449\n * binds the resulting access token to the proving public key so that\n * later API calls must come from the same key holder.\n */\nexport async function buildTokenEndpointDpopProof(\n options: BuildTokenEndpointDpopProofOptions\n): Promise<string> {\n const { appKeys, tokenEndpointUrl, sessionIdHash } = options;\n return signDpopProof({\n appKeys,\n claims: {\n htm: 'POST',\n htu: tokenEndpointUrl,\n jti: crypto.randomUUID(),\n iat: Math.floor(Date.now() / 1000),\n sid: sessionIdHash,\n },\n });\n}\n\nexport interface RequestOAuthTokenOptions {\n tokenEndpointUrl: string;\n /** Body parameters; serialized to `application/x-www-form-urlencoded`. */\n formParams: Record<string, string>;\n /**\n * When true, a `DPoP` header is required and `dpopProof` must be set.\n */\n isDpopEnabled: boolean;\n /**\n * DPoP proof for this request; required when `isDpopEnabled` is true.\n */\n dpopProof?: string;\n}\n\nexport interface RequestOAuthTokenSuccess {\n ok: true;\n body: OAuthTokenResponse;\n}\n\nexport interface RequestOAuthTokenFailure {\n ok: false;\n /** HTTP status returned by the upstream endpoint. */\n status: number;\n /** Error body as text — used to compose the SDK's error response. */\n errorText: string;\n}\n\nexport type RequestOAuthTokenResult =\n | RequestOAuthTokenSuccess\n | RequestOAuthTokenFailure;\n\n/**\n * POSTs an `application/x-www-form-urlencoded` body to a HubSpot token\n * endpoint. Attaches a `DPoP` header when `isDpopEnabled` is true and\n * `dpopProof` is provided. Reads the response once — either\n * as JSON on success or as text on failure — so callers never have to\n * consume the body twice.\n */\nexport async function requestOAuthToken(\n options: RequestOAuthTokenOptions\n): Promise<RequestOAuthTokenResult> {\n const { tokenEndpointUrl, formParams, dpopProof, isDpopEnabled } = options;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n if (isDpopEnabled) {\n if (!dpopProof) {\n throw new Error('DPoP proof is required when DPoP is enabled');\n }\n headers.DPoP = dpopProof;\n }\n const tokenResponse = await fetch(tokenEndpointUrl, {\n method: 'POST',\n headers,\n body: new URLSearchParams(formParams),\n });\n if (!tokenResponse.ok) {\n const errorText = await tokenResponse.text();\n return { ok: false, status: tokenResponse.status, errorText };\n }\n const body = (await tokenResponse.json()) as OAuthTokenResponse;\n return { ok: true, body };\n}\n\n/**\n * Form parameters always present on the OAuth `client_assertion` flow.\n * Spread into the call site's `formParams`.\n */\nexport function buildClientAssertionFormParams(input: {\n clientId: string;\n clientAssertion: string;\n}): Record<string, string> {\n const { clientId, clientAssertion } = input;\n return {\n client_id: clientId,\n client_assertion_type: JWT_BEARER_ASSERTION_TYPE,\n client_assertion: clientAssertion,\n };\n}\n\nexport interface BuildClientSecretFormParamsOptions {\n clientId: string;\n clientSecret: string;\n}\n\nexport function buildClientSecretFormParams(\n options: BuildClientSecretFormParamsOptions\n): Record<string, string> {\n const { clientId, clientSecret } = options;\n return {\n client_id: clientId,\n client_secret: clientSecret,\n };\n}\n"],"mappings":";;;;;;;;AASA,MAAM,2BAA2B;;;;;AAMjC,MAAM,4BACJ;;;;;AA0BF,eAAsB,qBACpB,SACiB;CACjB,MAAM,EAAE,SAAS,UAAU,aAAa;CACxC,OAAO,QAAQ;EACb,YAAY,QAAQ;EACpB,SAAS;GACP,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,OAAO,WAAW;EACzB;EACA,YAAY;CACd,CAAC;AACH;;;;;;AAeA,eAAsB,4BACpB,SACiB;CACjB,MAAM,EAAE,SAAS,kBAAkB,kBAAkB;CACrD,OAAO,cAAc;EACnB;EACA,QAAQ;GACN,KAAK;GACL,KAAK;GACL,KAAK,OAAO,WAAW;GACvB,KAAK,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;GACjC,KAAK;EACP;CACF,CAAC;AACH;;;;;;;;AAwCA,eAAsB,kBACpB,SACkC;CAClC,MAAM,EAAE,kBAAkB,YAAY,WAAW,kBAAkB;CACnE,MAAM,UAAkC,EACtC,gBAAgB,oCAClB;CACA,IAAI,eAAe;EACjB,IAAI,CAAC,WACH,MAAM,IAAI,MAAM,6CAA6C;EAE/D,QAAQ,OAAO;CACjB;CACA,MAAM,gBAAgB,MAAM,MAAM,kBAAkB;EAClD,QAAQ;EACR;EACA,MAAM,IAAI,gBAAgB,UAAU;CACtC,CAAC;CACD,IAAI,CAAC,cAAc,IAAI;EACrB,MAAM,YAAY,MAAM,cAAc,KAAK;EAC3C,OAAO;GAAE,IAAI;GAAO,QAAQ,cAAc;GAAQ;EAAU;CAC9D;CAEA,OAAO;EAAE,IAAI;EAAM,MAAA,MADC,cAAc,KAAK;CACf;AAC1B;;;;;AAMA,SAAgB,+BAA+B,OAGpB;CACzB,MAAM,EAAE,UAAU,oBAAoB;CACtC,OAAO;EACL,WAAW;EACX,uBAAuB;EACvB,kBAAkB;CACpB;AACF;AAOA,SAAgB,4BACd,SACwB;CACxB,MAAM,EAAE,UAAU,iBAAiB;CACnC,OAAO;EACL,WAAW;EACX,eAAe;CACjB;AACF"}