@hubspot/app-connect-sdk 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-format$colon$check.log +4 -0
- package/.turbo/turbo-lint.log +2 -0
- package/.turbo/turbo-test.log +76 -0
- package/.turbo/turbo-tsc.log +2 -0
- package/.turbo/turbo-tsdown.log +521 -0
- package/README.md +5 -0
- package/build/tsconfig.browser.tsbuildinfo +1 -0
- package/build/tsconfig.server.tsbuildinfo +1 -0
- package/dist/browser/HubSpotAppConnect-BW45gyDs.js +489 -0
- package/dist/browser/HubSpotAppConnect-BW45gyDs.js.map +1 -0
- package/dist/browser/assets/src/browser/react/components/AppConnectHeader/AppConnectHeader.css.ts.vanilla-DpJ0aBGF.css +211 -0
- package/dist/browser/assets/src/browser/react/components/Button/Button.css.ts.vanilla-Df16gUKx.css +42 -0
- package/dist/browser/assets/src/browser/react/components/ConnectButton/ConnectButton.css.ts.vanilla-BXXMQqfA.css +66 -0
- package/dist/browser/assets/src/browser/react/components/DisconnectedBody/DisconnectedBody.css.ts.vanilla-DLvostZL.css +19 -0
- package/dist/browser/assets/src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.css.ts.vanilla-Boi40eip.css +17 -0
- package/dist/browser/assets/src/browser/react/components/LoadingIndicator/LoadingIndicator.css.ts.vanilla-RVWGi6Ny.css +25 -0
- package/dist/browser/assets/src/browser/react/components/ShareButton/ShareButton.css.ts.vanilla-CY8SC-0T.css +40 -0
- package/dist/browser/assets/src/browser/theme-tokens.generated.css.ts.vanilla-C8Rjb8NH.css +220 -0
- package/dist/browser/assets/src/browser/theme.css.ts.vanilla-D_GBwEeI.css +12 -0
- package/dist/browser/create-vctOhpX9.js +517 -0
- package/dist/browser/create-vctOhpX9.js.map +1 -0
- package/dist/browser/index.d.ts +465 -0
- package/dist/browser/index.js +3 -0
- package/dist/browser/react/lovable.d.ts +30 -0
- package/dist/browser/react/lovable.js +23 -0
- package/dist/browser/react/lovable.js.map +1 -0
- package/dist/browser/react.d.ts +47 -0
- package/dist/browser/react.js +2 -0
- package/dist/browser/theme.css-CJbxi5hC.js +368 -0
- package/dist/browser/theme.css-CJbxi5hC.js.map +1 -0
- package/dist/browser/types-rTQw6A54.d.ts +79 -0
- package/dist/server/api-client-core/apis/account/account-info-types.generated.d.ts +111 -0
- package/dist/server/api-client-core/apis/account/account-info.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/account/account-info.generated.js +9 -0
- package/dist/server/api-client-core/apis/account/account-info.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/account/audit-logs-types.generated.d.ts +247 -0
- package/dist/server/api-client-core/apis/account/audit-logs.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/account/audit-logs.generated.js +28 -0
- package/dist/server/api-client-core/apis/account/audit-logs.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/auth/oauth-types.generated.d.ts +121 -0
- package/dist/server/api-client-core/apis/auth/oauth.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/auth/oauth.generated.js +19 -0
- package/dist/server/api-client-core/apis/auth/oauth.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/automation/actions-types.generated.d.ts +933 -0
- package/dist/server/api-client-core/apis/automation/actions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/automation/actions.generated.js +121 -0
- package/dist/server/api-client-core/apis/automation/actions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/automation/sequences-types.generated.d.ts +422 -0
- package/dist/server/api-client-core/apis/automation/sequences.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/automation/sequences.generated.js +22 -0
- package/dist/server/api-client-core/apis/automation/sequences.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/business-units-types.generated.d.ts +75 -0
- package/dist/server/api-client-core/apis/business-units.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/business-units.generated.js +12 -0
- package/dist/server/api-client-core/apis/business-units.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/authors-types.generated.d.ts +551 -0
- package/dist/server/api-client-core/apis/cms/authors.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/authors.generated.js +163 -0
- package/dist/server/api-client-core/apis/cms/authors.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/blog-settings-types.generated.d.ts +366 -0
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.js +43 -0
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/cms-content-audit-types.generated.d.ts +157 -0
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js +18 -0
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/domains-types.generated.d.ts +193 -0
- package/dist/server/api-client-core/apis/cms/domains.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/domains.generated.js +20 -0
- package/dist/server/api-client-core/apis/cms/domains.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/hubdb-types.generated.d.ts +1097 -0
- package/dist/server/api-client-core/apis/cms/hubdb.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/hubdb.generated.js +192 -0
- package/dist/server/api-client-core/apis/cms/hubdb.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/media-bridge-types.generated.d.ts +1780 -0
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.js +185 -0
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/pages-types.generated.d.ts +1768 -0
- package/dist/server/api-client-core/apis/cms/pages.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/pages.generated.js +331 -0
- package/dist/server/api-client-core/apis/cms/pages.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/posts-types.generated.d.ts +1090 -0
- package/dist/server/api-client-core/apis/cms/posts.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/posts.generated.js +201 -0
- package/dist/server/api-client-core/apis/cms/posts.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/site-search-types.generated.d.ts +200 -0
- package/dist/server/api-client-core/apis/cms/site-search.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/site-search.generated.js +32 -0
- package/dist/server/api-client-core/apis/cms/site-search.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/source-code-types.generated.d.ts +218 -0
- package/dist/server/api-client-core/apis/cms/source-code.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/source-code.generated.js +52 -0
- package/dist/server/api-client-core/apis/cms/source-code.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/tags-types.generated.d.ts +515 -0
- package/dist/server/api-client-core/apis/cms/tags.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/tags.generated.js +163 -0
- package/dist/server/api-client-core/apis/cms/tags.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/url-mappings-types.generated.d.ts +177 -0
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.js +14 -0
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/cms/url-redirects-types.generated.d.ts +226 -0
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.js +26 -0
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.d.ts +802 -0
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js +74 -0
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/conversations/custom-channels-types.generated.d.ts +551 -0
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js +80 -0
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/conversations/visitor-identification-types.generated.d.ts +60 -0
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js +6 -0
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/conversations-types.generated.d.ts +908 -0
- package/dist/server/api-client-core/apis/conversations.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/conversations.generated.js +108 -0
- package/dist/server/api-client-core/apis/conversations.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/app-uninstalls-types.generated.d.ts +37 -0
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js +6 -0
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/appointments-types.generated.d.ts +989 -0
- package/dist/server/api-client-core/apis/crm/appointments.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/appointments.generated.js +118 -0
- package/dist/server/api-client-core/apis/crm/appointments.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/associations-schema-types.generated.d.ts +329 -0
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.js +60 -0
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/associations-types.generated.d.ts +661 -0
- package/dist/server/api-client-core/apis/crm/associations.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/associations.generated.js +83 -0
- package/dist/server/api-client-core/apis/crm/associations.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/calling-extensions-types.generated.d.ts +466 -0
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js +42 -0
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/calls-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/calls.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/calls.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/calls.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/carts-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/carts.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/carts.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/carts.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/commerce-payments-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.d.ts +847 -0
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/communications-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/communications.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/communications.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/communications.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/companies-types.generated.d.ts +884 -0
- package/dist/server/api-client-core/apis/crm/companies.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/companies.generated.js +67 -0
- package/dist/server/api-client-core/apis/crm/companies.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/contacts-types.generated.d.ts +899 -0
- package/dist/server/api-client-core/apis/crm/contacts.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/contacts.generated.js +70 -0
- package/dist/server/api-client-core/apis/crm/contacts.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/contracts-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/contracts.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/contracts.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/contracts.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/courses-types.generated.d.ts +853 -0
- package/dist/server/api-client-core/apis/crm/courses.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/courses.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/courses.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/crm-owners-types.generated.d.ts +140 -0
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.js +20 -0
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/custom-objects-types.generated.d.ts +934 -0
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.js +101 -0
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/deal-splits-types.generated.d.ts +196 -0
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.js +9 -0
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/deals-types.generated.d.ts +872 -0
- package/dist/server/api-client-core/apis/crm/deals.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/deals.generated.js +67 -0
- package/dist/server/api-client-core/apis/crm/deals.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/discounts-types.generated.d.ts +846 -0
- package/dist/server/api-client-core/apis/crm/discounts.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/discounts.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/discounts.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/emails-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/emails.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/emails.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/emails.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/exports-types.generated.d.ts +281 -0
- package/dist/server/api-client-core/apis/crm/exports.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/exports.generated.js +12 -0
- package/dist/server/api-client-core/apis/crm/exports.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/feedback-submissions-types.generated.d.ts +616 -0
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js +55 -0
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/fees-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/fees.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/fees.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/fees.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/goal-targets-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/imports-types.generated.d.ts +371 -0
- package/dist/server/api-client-core/apis/crm/imports.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/imports.generated.js +30 -0
- package/dist/server/api-client-core/apis/crm/imports.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/invoices-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/invoices.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/invoices.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/invoices.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/leads-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/leads.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/leads.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/leads.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/limits-tracking-types.generated.d.ts +331 -0
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js +22 -0
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/line-items-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/line-items.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/line-items.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/line-items.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/listings-types.generated.d.ts +853 -0
- package/dist/server/api-client-core/apis/crm/listings.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/listings.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/listings.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/lists-types.generated.d.ts +2265 -0
- package/dist/server/api-client-core/apis/crm/lists.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/lists.generated.js +105 -0
- package/dist/server/api-client-core/apis/crm/lists.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/meetings-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/meetings.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/meetings.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/meetings.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/notes-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/notes.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/notes.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/notes.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/object-library-types.generated.d.ts +60 -0
- package/dist/server/api-client-core/apis/crm/object-library.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/object-library.generated.js +9 -0
- package/dist/server/api-client-core/apis/crm/object-library.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/objects-types.generated.d.ts +712 -0
- package/dist/server/api-client-core/apis/crm/objects.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/objects.generated.js +76 -0
- package/dist/server/api-client-core/apis/crm/objects.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/orders-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/orders.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/orders.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/orders.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/partner-clients-types.generated.d.ts +725 -0
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.js +71 -0
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/partner-services-types.generated.d.ts +725 -0
- package/dist/server/api-client-core/apis/crm/partner-services.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/partner-services.generated.js +71 -0
- package/dist/server/api-client-core/apis/crm/partner-services.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/pipelines-types.generated.d.ts +430 -0
- package/dist/server/api-client-core/apis/crm/pipelines.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/pipelines.generated.js +94 -0
- package/dist/server/api-client-core/apis/crm/pipelines.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/postal-mail-types.generated.d.ts +844 -0
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/products-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/products.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/products.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/products.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/projects-types.generated.d.ts +881 -0
- package/dist/server/api-client-core/apis/crm/projects.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/projects.generated.js +67 -0
- package/dist/server/api-client-core/apis/crm/projects.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/properties-types.generated.d.ts +603 -0
- package/dist/server/api-client-core/apis/crm/properties.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/properties.generated.js +86 -0
- package/dist/server/api-client-core/apis/crm/properties.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/property-validations-types.generated.d.ts +121 -0
- package/dist/server/api-client-core/apis/crm/property-validations.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/property-validations.generated.js +25 -0
- package/dist/server/api-client-core/apis/crm/property-validations.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.d.ts +486 -0
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js +34 -0
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.d.ts +247 -0
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js +69 -0
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/quotes-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/quotes.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/quotes.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/quotes.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/schemas-types.generated.d.ts +669 -0
- package/dist/server/api-client-core/apis/crm/schemas.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/schemas.generated.js +41 -0
- package/dist/server/api-client-core/apis/crm/schemas.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/services-types.generated.d.ts +853 -0
- package/dist/server/api-client-core/apis/crm/services.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/services.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/services.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/tasks-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/tasks.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/tasks.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/tasks.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/taxes-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/taxes.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/taxes.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/taxes.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/tickets-types.generated.d.ts +884 -0
- package/dist/server/api-client-core/apis/crm/tickets.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/tickets.generated.js +67 -0
- package/dist/server/api-client-core/apis/crm/tickets.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/timeline-types.generated.d.ts +187 -0
- package/dist/server/api-client-core/apis/crm/timeline.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/timeline.generated.js +12 -0
- package/dist/server/api-client-core/apis/crm/timeline.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/transcriptions-types.generated.d.ts +152 -0
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.js +15 -0
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/users-types.generated.d.ts +850 -0
- package/dist/server/api-client-core/apis/crm/users.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/users.generated.js +66 -0
- package/dist/server/api-client-core/apis/crm/users.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.d.ts +72 -0
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js +13 -0
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/events/manage-event-definitions-types.generated.d.ts +1005 -0
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js +39 -0
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/events/send-event-completions-types.generated.d.ts +94 -0
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.js +9 -0
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/events-types.generated.d.ts +137 -0
- package/dist/server/api-client-core/apis/events.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/events.generated.js +23 -0
- package/dist/server/api-client-core/apis/events.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/files-types.generated.d.ts +791 -0
- package/dist/server/api-client-core/apis/files.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/files.generated.js +119 -0
- package/dist/server/api-client-core/apis/files.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.d.ts +989 -0
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js +139 -0
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/marketing/marketing-emails-types.generated.d.ts +883 -0
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js +108 -0
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/marketing/marketing-events-types.generated.d.ts +1788 -0
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js +176 -0
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/marketing/single-send-types.generated.d.ts +123 -0
- package/dist/server/api-client-core/apis/marketing/single-send.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/marketing/single-send.generated.js +6 -0
- package/dist/server/api-client-core/apis/marketing/single-send.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/marketing/transactional-single-send-types.generated.d.ts +257 -0
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js +20 -0
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/meta/origins-types.generated.d.ts +77 -0
- package/dist/server/api-client-core/apis/meta/origins.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/meta/origins.generated.js +15 -0
- package/dist/server/api-client-core/apis/meta/origins.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/scheduler/meetings-types.generated.d.ts +913 -0
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.js +34 -0
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/settings/multicurrency-types.generated.d.ts +404 -0
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.js +38 -0
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/settings/tax-rates-types.generated.d.ts +111 -0
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.js +13 -0
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/settings/user-provisioning-types.generated.d.ts +297 -0
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js +31 -0
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/webhooks-journal-types.generated.d.ts +643 -0
- package/dist/server/api-client-core/apis/webhooks-journal.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/webhooks-journal.generated.js +75 -0
- package/dist/server/api-client-core/apis/webhooks-journal.generated.js.map +1 -0
- package/dist/server/api-client-core/apis/webhooks-types.generated.d.ts +1016 -0
- package/dist/server/api-client-core/apis/webhooks.generated.d.ts +7 -0
- package/dist/server/api-client-core/apis/webhooks.generated.js +105 -0
- package/dist/server/api-client-core/apis/webhooks.generated.js.map +1 -0
- package/dist/server/api-client-core/binary-data.d.ts +33 -0
- package/dist/server/api-client-core/binary-data.js +29 -0
- package/dist/server/api-client-core/binary-data.js.map +1 -0
- package/dist/server/api-client-core/client.d.ts +14 -0
- package/dist/server/api-client-core/client.js +75 -0
- package/dist/server/api-client-core/client.js.map +1 -0
- package/dist/server/api-client-core/codegen-helpers/file-op-wrappers.js +25 -0
- package/dist/server/api-client-core/codegen-helpers/file-op-wrappers.js.map +1 -0
- package/dist/server/api-client-core/errors.d.ts +27 -0
- package/dist/server/api-client-core/errors.js +33 -0
- package/dist/server/api-client-core/errors.js.map +1 -0
- package/dist/server/api-client-core/op.d.ts +37 -0
- package/dist/server/api-client-core/op.js +44 -0
- package/dist/server/api-client-core/op.js.map +1 -0
- package/dist/server/api-client-core/pagination.d.ts +60 -0
- package/dist/server/api-client-core/pagination.js +103 -0
- package/dist/server/api-client-core/pagination.js.map +1 -0
- package/dist/server/api-client-core/plugins/fetch-transport.js +72 -0
- package/dist/server/api-client-core/plugins/fetch-transport.js.map +1 -0
- package/dist/server/api-client-core/types.d.ts +135 -0
- package/dist/server/api-client.d.ts +197 -0
- package/dist/server/api-client.js +101 -0
- package/dist/server/constants.js +46 -0
- package/dist/server/constants.js.map +1 -0
- package/dist/server/deno/start.d.ts +12 -0
- package/dist/server/deno/start.js +21 -0
- package/dist/server/deno/start.js.map +1 -0
- package/dist/server/hono/hono-request-handler.js +54 -0
- package/dist/server/hono/hono-request-handler.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/auth-callback.js +125 -0
- package/dist/server/hono/hubspot-connect-routes/auth-callback.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/auth-init-session.js +90 -0
- package/dist/server/hono/hubspot-connect-routes/auth-init-session.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/auth-logout.js +97 -0
- package/dist/server/hono/hubspot-connect-routes/auth-logout.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/auth-refresh.js +101 -0
- package/dist/server/hono/hubspot-connect-routes/auth-refresh.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.d.ts +16 -0
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.js +13 -0
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js +42 -0
- package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/constants.js +8 -0
- package/dist/server/hono/hubspot-connect-routes/constants.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.js +43 -0
- package/dist/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js +35 -0
- package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js +34 -0
- package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/oauth-client.js +104 -0
- package/dist/server/hono/hubspot-connect-routes/oauth-client.js.map +1 -0
- package/dist/server/hono/hubspot-connect-routes/utils.js +73 -0
- package/dist/server/hono/hubspot-connect-routes/utils.js.map +1 -0
- package/dist/server/hono/index.js +4 -0
- package/dist/server/hono/types.d.ts +28 -0
- package/dist/server/hono/utils/cookie-utils.js +29 -0
- package/dist/server/hono/utils/cookie-utils.js.map +1 -0
- package/dist/server/import-app-keys.js +42 -0
- package/dist/server/import-app-keys.js.map +1 -0
- package/dist/server/lovable/create-app-function-start.d.ts +26 -0
- package/dist/server/lovable/create-app-function-start.js +28 -0
- package/dist/server/lovable/create-app-function-start.js.map +1 -0
- package/dist/server/lovable/hubspot-connect/index.d.ts +15 -0
- package/dist/server/lovable/hubspot-connect/index.js +20 -0
- package/dist/server/lovable/hubspot-connect/index.js.map +1 -0
- package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js +29 -0
- package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js.map +1 -0
- package/dist/server/lovable.d.ts +6 -0
- package/dist/server/lovable.js +4 -0
- package/dist/server/oauth.d.ts +6 -0
- package/dist/server/oauth.js +5 -0
- package/dist/server/proxy.js +68 -0
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/sanitize-request.js +41 -0
- package/dist/server/sanitize-request.js.map +1 -0
- package/dist/server/secure-start-core.d.ts +23 -0
- package/dist/server/secure-start-core.js +28 -0
- package/dist/server/secure-start-core.js.map +1 -0
- package/dist/server/shared/constants.js +17 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/encoding/base64.js +45 -0
- package/dist/server/shared/encoding/base64.js.map +1 -0
- package/dist/server/shared/encoding/sha256.d.ts +10 -0
- package/dist/server/shared/encoding/sha256.js +15 -0
- package/dist/server/shared/encoding/sha256.js.map +1 -0
- package/dist/server/shared/logger.d.ts +15 -0
- package/dist/server/shared/logger.js +16 -0
- package/dist/server/shared/logger.js.map +1 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/utils/cookie-utils.js +21 -0
- package/dist/server/utils/cookie-utils.js.map +1 -0
- package/dist/server/utils/dpop-utils.d.ts +67 -0
- package/dist/server/utils/dpop-utils.js +75 -0
- package/dist/server/utils/dpop-utils.js.map +1 -0
- package/dist/server/utils/env-utils.js +54 -0
- package/dist/server/utils/env-utils.js.map +1 -0
- package/dist/server/utils/jwk-utils.d.ts +16 -0
- package/dist/server/utils/jwk-utils.js +24 -0
- package/dist/server/utils/jwk-utils.js.map +1 -0
- package/dist/server/utils/jwt-utils.d.ts +39 -0
- package/dist/server/utils/jwt-utils.js +87 -0
- package/dist/server/utils/jwt-utils.js.map +1 -0
- package/eslint.config.js +5 -0
- package/package.json +68 -0
- package/src/browser/app-connect-controller/README.md +92 -0
- package/src/browser/app-connect-controller/connect-start.ts +45 -0
- package/src/browser/app-connect-controller/constants.ts +15 -0
- package/src/browser/app-connect-controller/create.ts +137 -0
- package/src/browser/app-connect-controller/default-session-storage.ts +21 -0
- package/src/browser/app-connect-controller/disconnect.ts +54 -0
- package/src/browser/app-connect-controller/init.ts +35 -0
- package/src/browser/app-connect-controller/refresh.ts +124 -0
- package/src/browser/app-connect-controller/types.ts +48 -0
- package/src/browser/app-connect-controller/utils/crypto-utils.ts +1 -0
- package/src/browser/app-connect-controller/utils/encode-utils.ts +1 -0
- package/src/browser/app-connect-controller/utils/memoize-utils.test.ts +48 -0
- package/src/browser/app-connect-controller/utils/memoize-utils.ts +26 -0
- package/src/browser/app-connect-controller/utils/session-utils.test.ts +127 -0
- package/src/browser/app-connect-controller/utils/session-utils.ts +58 -0
- package/src/browser/app-connect-controller/utils/store-utils.test.ts +102 -0
- package/src/browser/app-connect-controller/utils/store-utils.ts +119 -0
- package/src/browser/app-connect-controller/utils/timeout-utils.ts +8 -0
- package/src/browser/app-connect-controller/view-state.test.ts +70 -0
- package/src/browser/app-connect-controller/view-state.ts +40 -0
- package/src/browser/index.ts +13 -0
- package/src/browser/react/components/AppConnectHeader/AppConnectHeader.css.ts +231 -0
- package/src/browser/react/components/AppConnectHeader/AppConnectHeader.tsx +124 -0
- package/src/browser/react/components/Button/Button.css.ts +59 -0
- package/src/browser/react/components/Button/Button.tsx +38 -0
- package/src/browser/react/components/ConnectButton/ConnectButton.css.ts +73 -0
- package/src/browser/react/components/ConnectButton/ConnectButton.tsx +43 -0
- package/src/browser/react/components/DisconnectedBody/DisconnectedBody.css.ts +25 -0
- package/src/browser/react/components/DisconnectedBody/DisconnectedBody.tsx +25 -0
- package/src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.css.ts +23 -0
- package/src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.tsx +90 -0
- package/src/browser/react/components/LoadingIndicator/LoadingIndicator.css.ts +28 -0
- package/src/browser/react/components/LoadingIndicator/LoadingIndicator.tsx +9 -0
- package/src/browser/react/components/ShareButton/ShareButton.css.ts +52 -0
- package/src/browser/react/components/ShareButton/ShareButton.tsx +43 -0
- package/src/browser/react/components/icons/ChevronDownIcon.tsx +23 -0
- package/src/browser/react/components/icons/ExternalLinkIcon.tsx +23 -0
- package/src/browser/react/components/icons/HubSpotDataSourceIcon.tsx +33 -0
- package/src/browser/react/components/icons/LogoutIcon.tsx +37 -0
- package/src/browser/react/components/icons/ShareIcon.tsx +31 -0
- package/src/browser/react/context.ts +12 -0
- package/src/browser/react/hooks.ts +28 -0
- package/src/browser/react/index.ts +6 -0
- package/src/browser/react/lovable/LovableHubSpotAppConnect.tsx +37 -0
- package/src/browser/react/lovable/index.ts +4 -0
- package/src/browser/theme-tokens.generated.css.ts +424 -0
- package/src/browser/theme.css.ts +21 -0
- package/src/browser/types.ts +83 -0
- package/src/server/api-client-core/apis/account/account-info-types.generated.ts +116 -0
- package/src/server/api-client-core/apis/account/account-info.generated.ts +14 -0
- package/src/server/api-client-core/apis/account/audit-logs-types.generated.ts +409 -0
- package/src/server/api-client-core/apis/account/audit-logs.generated.ts +41 -0
- package/src/server/api-client-core/apis/auth/oauth-types.generated.ts +138 -0
- package/src/server/api-client-core/apis/auth/oauth.generated.ts +26 -0
- package/src/server/api-client-core/apis/automation/actions-types.generated.ts +1337 -0
- package/src/server/api-client-core/apis/automation/actions.generated.ts +166 -0
- package/src/server/api-client-core/apis/automation/sequences-types.generated.ts +456 -0
- package/src/server/api-client-core/apis/automation/sequences.generated.ts +34 -0
- package/src/server/api-client-core/apis/business-units-types.generated.ts +82 -0
- package/src/server/api-client-core/apis/business-units.generated.ts +16 -0
- package/src/server/api-client-core/apis/cms/authors-types.generated.ts +4003 -0
- package/src/server/api-client-core/apis/cms/authors.generated.ts +199 -0
- package/src/server/api-client-core/apis/cms/blog-settings-types.generated.ts +3795 -0
- package/src/server/api-client-core/apis/cms/blog-settings.generated.ts +79 -0
- package/src/server/api-client-core/apis/cms/cms-content-audit-types.generated.ts +198 -0
- package/src/server/api-client-core/apis/cms/cms-content-audit.generated.ts +31 -0
- package/src/server/api-client-core/apis/cms/domains-types.generated.ts +201 -0
- package/src/server/api-client-core/apis/cms/domains.generated.ts +30 -0
- package/src/server/api-client-core/apis/cms/hubdb-types.generated.ts +1276 -0
- package/src/server/api-client-core/apis/cms/hubdb.generated.ts +220 -0
- package/src/server/api-client-core/apis/cms/media-bridge-types.generated.ts +8928 -0
- package/src/server/api-client-core/apis/cms/media-bridge.generated.ts +244 -0
- package/src/server/api-client-core/apis/cms/pages-types.generated.ts +5548 -0
- package/src/server/api-client-core/apis/cms/pages.generated.ts +423 -0
- package/src/server/api-client-core/apis/cms/posts-types.generated.ts +4682 -0
- package/src/server/api-client-core/apis/cms/posts.generated.ts +254 -0
- package/src/server/api-client-core/apis/cms/site-search-types.generated.ts +1914 -0
- package/src/server/api-client-core/apis/cms/site-search.generated.ts +40 -0
- package/src/server/api-client-core/apis/cms/source-code-types.generated.ts +240 -0
- package/src/server/api-client-core/apis/cms/source-code.generated.ts +54 -0
- package/src/server/api-client-core/apis/cms/tags-types.generated.ts +3969 -0
- package/src/server/api-client-core/apis/cms/tags.generated.ts +199 -0
- package/src/server/api-client-core/apis/cms/url-mappings-types.generated.ts +245 -0
- package/src/server/api-client-core/apis/cms/url-mappings.generated.ts +25 -0
- package/src/server/api-client-core/apis/cms/url-redirects-types.generated.ts +241 -0
- package/src/server/api-client-core/apis/cms/url-redirects.generated.ts +40 -0
- package/src/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.ts +893 -0
- package/src/server/api-client-core/apis/communication-preferences/subscriptions.generated.ts +108 -0
- package/src/server/api-client-core/apis/conversations/custom-channels-types.generated.ts +687 -0
- package/src/server/api-client-core/apis/conversations/custom-channels.generated.ts +121 -0
- package/src/server/api-client-core/apis/conversations/visitor-identification-types.generated.ts +66 -0
- package/src/server/api-client-core/apis/conversations/visitor-identification.generated.ts +14 -0
- package/src/server/api-client-core/apis/conversations-types.generated.ts +1126 -0
- package/src/server/api-client-core/apis/conversations.generated.ts +152 -0
- package/src/server/api-client-core/apis/crm/app-uninstalls-types.generated.ts +37 -0
- package/src/server/api-client-core/apis/crm/app-uninstalls.generated.ts +12 -0
- package/src/server/api-client-core/apis/crm/appointments-types.generated.ts +1094 -0
- package/src/server/api-client-core/apis/crm/appointments.generated.ts +153 -0
- package/src/server/api-client-core/apis/crm/associations-schema-types.generated.ts +403 -0
- package/src/server/api-client-core/apis/crm/associations-schema.generated.ts +99 -0
- package/src/server/api-client-core/apis/crm/associations-types.generated.ts +750 -0
- package/src/server/api-client-core/apis/crm/associations.generated.ts +134 -0
- package/src/server/api-client-core/apis/crm/calling-extensions-types.generated.ts +565 -0
- package/src/server/api-client-core/apis/crm/calling-extensions.generated.ts +75 -0
- package/src/server/api-client-core/apis/crm/calls-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/calls.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/carts-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/carts.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/commerce-payments-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/commerce-payments.generated.ts +115 -0
- package/src/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.ts +935 -0
- package/src/server/api-client-core/apis/crm/commerce-subscriptions.generated.ts +109 -0
- package/src/server/api-client-core/apis/crm/communications-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/communications.generated.ts +115 -0
- package/src/server/api-client-core/apis/crm/companies-types.generated.ts +976 -0
- package/src/server/api-client-core/apis/crm/companies.generated.ts +112 -0
- package/src/server/api-client-core/apis/crm/contacts-types.generated.ts +996 -0
- package/src/server/api-client-core/apis/crm/contacts.generated.ts +114 -0
- package/src/server/api-client-core/apis/crm/contracts-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/contracts.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/courses-types.generated.ts +941 -0
- package/src/server/api-client-core/apis/crm/courses.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/crm-owners-types.generated.ts +148 -0
- package/src/server/api-client-core/apis/crm/crm-owners.generated.ts +25 -0
- package/src/server/api-client-core/apis/crm/custom-objects-types.generated.ts +1024 -0
- package/src/server/api-client-core/apis/crm/custom-objects.generated.ts +136 -0
- package/src/server/api-client-core/apis/crm/deal-splits-types.generated.ts +208 -0
- package/src/server/api-client-core/apis/crm/deal-splits.generated.ts +14 -0
- package/src/server/api-client-core/apis/crm/deals-types.generated.ts +963 -0
- package/src/server/api-client-core/apis/crm/deals.generated.ts +107 -0
- package/src/server/api-client-core/apis/crm/discounts-types.generated.ts +934 -0
- package/src/server/api-client-core/apis/crm/discounts.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/emails-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/emails.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/exports-types.generated.ts +360 -0
- package/src/server/api-client-core/apis/crm/exports.generated.ts +24 -0
- package/src/server/api-client-core/apis/crm/feedback-submissions-types.generated.ts +676 -0
- package/src/server/api-client-core/apis/crm/feedback-submissions.generated.ts +89 -0
- package/src/server/api-client-core/apis/crm/fees-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/fees.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/goal-targets-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/goal-targets.generated.ts +107 -0
- package/src/server/api-client-core/apis/crm/imports-types.generated.ts +754 -0
- package/src/server/api-client-core/apis/crm/imports.generated.ts +41 -0
- package/src/server/api-client-core/apis/crm/invoices-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/invoices.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/leads-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/leads.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/limits-tracking-types.generated.ts +371 -0
- package/src/server/api-client-core/apis/crm/limits-tracking.generated.ts +42 -0
- package/src/server/api-client-core/apis/crm/line-items-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/line-items.generated.ts +107 -0
- package/src/server/api-client-core/apis/crm/listings-types.generated.ts +941 -0
- package/src/server/api-client-core/apis/crm/listings.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/lists-types.generated.ts +3053 -0
- package/src/server/api-client-core/apis/crm/lists.generated.ts +166 -0
- package/src/server/api-client-core/apis/crm/meetings-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/meetings.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/notes-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/notes.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/object-library-types.generated.ts +67 -0
- package/src/server/api-client-core/apis/crm/object-library.generated.ts +16 -0
- package/src/server/api-client-core/apis/crm/objects-types.generated.ts +785 -0
- package/src/server/api-client-core/apis/crm/objects.generated.ts +90 -0
- package/src/server/api-client-core/apis/crm/orders-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/orders.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/partner-clients-types.generated.ts +804 -0
- package/src/server/api-client-core/apis/crm/partner-clients.generated.ts +108 -0
- package/src/server/api-client-core/apis/crm/partner-services-types.generated.ts +802 -0
- package/src/server/api-client-core/apis/crm/partner-services.generated.ts +108 -0
- package/src/server/api-client-core/apis/crm/pipelines-types.generated.ts +491 -0
- package/src/server/api-client-core/apis/crm/pipelines.generated.ts +144 -0
- package/src/server/api-client-core/apis/crm/postal-mail-types.generated.ts +932 -0
- package/src/server/api-client-core/apis/crm/postal-mail.generated.ts +107 -0
- package/src/server/api-client-core/apis/crm/products-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/products.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/projects-types.generated.ts +973 -0
- package/src/server/api-client-core/apis/crm/projects.generated.ts +112 -0
- package/src/server/api-client-core/apis/crm/properties-types.generated.ts +705 -0
- package/src/server/api-client-core/apis/crm/properties.generated.ts +97 -0
- package/src/server/api-client-core/apis/crm/property-validations-types.generated.ts +225 -0
- package/src/server/api-client-core/apis/crm/property-validations.generated.ts +47 -0
- package/src/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.ts +550 -0
- package/src/server/api-client-core/apis/crm/public-app-crm-cards.generated.ts +46 -0
- package/src/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.ts +284 -0
- package/src/server/api-client-core/apis/crm/public-app-feature-flags.generated.ts +89 -0
- package/src/server/api-client-core/apis/crm/quotes-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/quotes.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/schemas-types.generated.ts +735 -0
- package/src/server/api-client-core/apis/crm/schemas.generated.ts +68 -0
- package/src/server/api-client-core/apis/crm/services-types.generated.ts +941 -0
- package/src/server/api-client-core/apis/crm/services.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/tasks-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/tasks.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/taxes-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/taxes.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/tickets-types.generated.ts +976 -0
- package/src/server/api-client-core/apis/crm/tickets.generated.ts +112 -0
- package/src/server/api-client-core/apis/crm/timeline-types.generated.ts +207 -0
- package/src/server/api-client-core/apis/crm/timeline.generated.ts +23 -0
- package/src/server/api-client-core/apis/crm/transcriptions-types.generated.ts +200 -0
- package/src/server/api-client-core/apis/crm/transcriptions.generated.ts +29 -0
- package/src/server/api-client-core/apis/crm/users-types.generated.ts +938 -0
- package/src/server/api-client-core/apis/crm/users.generated.ts +106 -0
- package/src/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.ts +78 -0
- package/src/server/api-client-core/apis/crm/video-conferencing-extension.generated.ts +25 -0
- package/src/server/api-client-core/apis/events/manage-event-definitions-types.generated.ts +1621 -0
- package/src/server/api-client-core/apis/events/manage-event-definitions.generated.ts +73 -0
- package/src/server/api-client-core/apis/events/send-event-completions-types.generated.ts +103 -0
- package/src/server/api-client-core/apis/events/send-event-completions.generated.ts +19 -0
- package/src/server/api-client-core/apis/events-types.generated.ts +145 -0
- package/src/server/api-client-core/apis/events.generated.ts +30 -0
- package/src/server/api-client-core/apis/files-types.generated.ts +904 -0
- package/src/server/api-client-core/apis/files.generated.ts +164 -0
- package/src/server/api-client-core/apis/index.generated.ts +97 -0
- package/src/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.ts +1434 -0
- package/src/server/api-client-core/apis/marketing/campaigns-public-api.generated.ts +191 -0
- package/src/server/api-client-core/apis/marketing/marketing-emails-types.generated.ts +3858 -0
- package/src/server/api-client-core/apis/marketing/marketing-emails.generated.ts +146 -0
- package/src/server/api-client-core/apis/marketing/marketing-events-types.generated.ts +2122 -0
- package/src/server/api-client-core/apis/marketing/marketing-events.generated.ts +320 -0
- package/src/server/api-client-core/apis/marketing/single-send-types.generated.ts +178 -0
- package/src/server/api-client-core/apis/marketing/single-send.generated.ts +15 -0
- package/src/server/api-client-core/apis/marketing/transactional-single-send-types.generated.ts +337 -0
- package/src/server/api-client-core/apis/marketing/transactional-single-send.generated.ts +44 -0
- package/src/server/api-client-core/apis/meta/origins-types.generated.ts +84 -0
- package/src/server/api-client-core/apis/meta/origins.generated.ts +19 -0
- package/src/server/api-client-core/apis/scheduler/meetings-types.generated.ts +1110 -0
- package/src/server/api-client-core/apis/scheduler/meetings.generated.ts +50 -0
- package/src/server/api-client-core/apis/settings/multicurrency-types.generated.ts +2054 -0
- package/src/server/api-client-core/apis/settings/multicurrency.generated.ts +78 -0
- package/src/server/api-client-core/apis/settings/tax-rates-types.generated.ts +119 -0
- package/src/server/api-client-core/apis/settings/tax-rates.generated.ts +23 -0
- package/src/server/api-client-core/apis/settings/user-provisioning-types.generated.ts +322 -0
- package/src/server/api-client-core/apis/settings/user-provisioning.generated.ts +48 -0
- package/src/server/api-client-core/apis/webhooks-journal-types.generated.ts +906 -0
- package/src/server/api-client-core/apis/webhooks-journal.generated.ts +131 -0
- package/src/server/api-client-core/apis/webhooks-types.generated.ts +1423 -0
- package/src/server/api-client-core/apis/webhooks.generated.ts +171 -0
- package/src/server/api-client-core/binary-data.ts +38 -0
- package/src/server/api-client-core/client.ts +115 -0
- package/src/server/api-client-core/codegen-helpers/file-op-wrappers.ts +25 -0
- package/src/server/api-client-core/errors.ts +31 -0
- package/src/server/api-client-core/index.ts +49 -0
- package/src/server/api-client-core/op.ts +61 -0
- package/src/server/api-client-core/pagination.ts +106 -0
- package/src/server/api-client-core/plugins/fetch-transport.ts +115 -0
- package/src/server/api-client-core/plugins/index.ts +10 -0
- package/src/server/api-client-core/types.ts +148 -0
- package/src/server/api-client.ts +1 -0
- package/src/server/constants.ts +53 -0
- package/src/server/deno/index.ts +1 -0
- package/src/server/deno/start.ts +25 -0
- package/src/server/hono/hono-request-handler.ts +106 -0
- package/src/server/hono/hubspot-connect-routes/auth-callback.test.ts +225 -0
- package/src/server/hono/hubspot-connect-routes/auth-callback.ts +198 -0
- package/src/server/hono/hubspot-connect-routes/auth-init-session.test.ts +144 -0
- package/src/server/hono/hubspot-connect-routes/auth-init-session.ts +126 -0
- package/src/server/hono/hubspot-connect-routes/auth-logout.test.ts +124 -0
- package/src/server/hono/hubspot-connect-routes/auth-logout.ts +140 -0
- package/src/server/hono/hubspot-connect-routes/auth-refresh.test.ts +224 -0
- package/src/server/hono/hubspot-connect-routes/auth-refresh.ts +171 -0
- package/src/server/hono/hubspot-connect-routes/cimd-client-metadata-types.ts +54 -0
- package/src/server/hono/hubspot-connect-routes/cimd-public-routes.test.ts +128 -0
- package/src/server/hono/hubspot-connect-routes/cimd-public-routes.ts +72 -0
- package/src/server/hono/hubspot-connect-routes/constants.ts +3 -0
- package/src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.test.ts +75 -0
- package/src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.ts +73 -0
- package/src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts +95 -0
- package/src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts +145 -0
- package/src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts +67 -0
- package/src/server/hono/hubspot-connect-routes/oauth-client.ts +181 -0
- package/src/server/hono/hubspot-connect-routes/types.ts +36 -0
- package/src/server/hono/hubspot-connect-routes/utils.test.ts +132 -0
- package/src/server/hono/hubspot-connect-routes/utils.ts +138 -0
- package/src/server/hono/index.ts +6 -0
- package/src/server/hono/types.ts +25 -0
- package/src/server/hono/utils/cookie-utils.ts +55 -0
- package/src/server/import-app-keys.ts +55 -0
- package/src/server/lovable/create-app-function-start.ts +55 -0
- package/src/server/lovable/hubspot-connect/index.ts +28 -0
- package/src/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.ts +40 -0
- package/src/server/lovable/index.ts +16 -0
- package/src/server/node/index.ts +1 -0
- package/src/server/node/start.ts +25 -0
- package/src/server/oauth.ts +6 -0
- package/src/server/proxy.test.ts +80 -0
- package/src/server/proxy.ts +116 -0
- package/src/server/sanitize-request.test.ts +65 -0
- package/src/server/sanitize-request.ts +52 -0
- package/src/server/secure-start-core.ts +67 -0
- package/src/server/types.ts +62 -0
- package/src/server/utils/base64-utils.ts +5 -0
- package/src/server/utils/cookie-utils.test.ts +48 -0
- package/src/server/utils/cookie-utils.ts +26 -0
- package/src/server/utils/crypto-utils.ts +1 -0
- package/src/server/utils/dpop-utils.test.ts +102 -0
- package/src/server/utils/dpop-utils.ts +161 -0
- package/src/server/utils/env-utils.test.ts +92 -0
- package/src/server/utils/env-utils.ts +65 -0
- package/src/server/utils/jwk-utils.test.ts +34 -0
- package/src/server/utils/jwk-utils.ts +30 -0
- package/src/server/utils/jwt-utils.test.ts +81 -0
- package/src/server/utils/jwt-utils.ts +141 -0
- package/src/server/utils/test-fixtures.ts +32 -0
- package/src/shared/constants.ts +13 -0
- package/src/shared/encoding/base64.test.ts +57 -0
- package/src/shared/encoding/base64.ts +50 -0
- package/src/shared/encoding/sha256.test.ts +25 -0
- package/src/shared/encoding/sha256.ts +14 -0
- package/src/shared/logger.ts +50 -0
- package/src/shared/wire-types.ts +40 -0
- package/tsconfig.browser.json +10 -0
- package/tsconfig.json +8 -0
- package/tsconfig.server.json +12 -0
- package/tsdown.config.ts +38 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { sha256base64url } from "../../shared/encoding/sha256.js";
|
|
2
|
+
import { HUBSPOT_ACCESS_TOKEN_COOKIE_NAME, HUBSPOT_APP_SID_COOKIE_NAME, HUBSPOT_REFRESH_COOKIE_PREFIX } from "../../constants.js";
|
|
3
|
+
import { parseCookies } from "../../utils/cookie-utils.js";
|
|
4
|
+
import { serializeCookie, setResponseCookie } from "../utils/cookie-utils.js";
|
|
5
|
+
import { REFRESH_COOKIE_MAX_AGE_SEC } from "./constants.js";
|
|
6
|
+
import { buildClientAssertion, buildClientAssertionFormParams, buildClientSecretFormParams, buildTokenEndpointDpopProof, requestOAuthToken } from "./oauth-client.js";
|
|
7
|
+
import { buildCimdClientIdUrlFromRequest, isPositiveFiniteNumber } from "./utils.js";
|
|
8
|
+
//#region src/server/hono/hubspot-connect-routes/auth-refresh.ts
|
|
9
|
+
async function handleAuthRefresh(c, options) {
|
|
10
|
+
const { appKeys, refreshCookiePath, basePath, hubspotConnectEnv } = options;
|
|
11
|
+
const xForwardedProto = c.req.header("x-forwarded-proto") ?? void 0;
|
|
12
|
+
const xForwardedHost = c.req.header("x-forwarded-host") ?? void 0;
|
|
13
|
+
const requestHostHeader = c.req.header("host") ?? void 0;
|
|
14
|
+
const cookies = parseCookies(c.req.header("Cookie"));
|
|
15
|
+
const sessionId = cookies[HUBSPOT_APP_SID_COOKIE_NAME];
|
|
16
|
+
if (!sessionId) return c.json({ error: "Missing session cookie" }, 401);
|
|
17
|
+
if (hubspotConnectEnv.isAppPrivateKeyRequired && !appKeys) return c.json({ error: "Server misconfiguration: HUBSPOT_APP_PRIVATE_KEY is required when CIMD or DPoP is enabled" }, 500);
|
|
18
|
+
const sidHash = await sha256base64url(sessionId);
|
|
19
|
+
const refreshCookieName = `${HUBSPOT_REFRESH_COOKIE_PREFIX}${sidHash}`;
|
|
20
|
+
const refreshToken = cookies[refreshCookieName];
|
|
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;
|
|
29
|
+
const tokenEndpointUrl = new URL("/oauth/v1/token", hubspotConnectEnv.hubspotOAuthApiOrigin).href;
|
|
30
|
+
let dpopProof;
|
|
31
|
+
if (hubspotConnectEnv.isDpopEnabled) dpopProof = await buildTokenEndpointDpopProof({
|
|
32
|
+
appKeys,
|
|
33
|
+
tokenEndpointUrl,
|
|
34
|
+
sessionIdHash: sidHash
|
|
35
|
+
});
|
|
36
|
+
let formParams;
|
|
37
|
+
if (hubspotConnectEnv.isCimdEnabled) formParams = {
|
|
38
|
+
grant_type: "refresh_token",
|
|
39
|
+
refresh_token: refreshToken,
|
|
40
|
+
...buildClientAssertionFormParams({
|
|
41
|
+
clientId,
|
|
42
|
+
clientAssertion: await buildClientAssertion({
|
|
43
|
+
appKeys,
|
|
44
|
+
clientId,
|
|
45
|
+
audience: tokenEndpointUrl
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
};
|
|
49
|
+
else formParams = {
|
|
50
|
+
grant_type: "refresh_token",
|
|
51
|
+
refresh_token: refreshToken,
|
|
52
|
+
...buildClientSecretFormParams({
|
|
53
|
+
clientId,
|
|
54
|
+
clientSecret: hubspotConnectEnv.hubspotClientSecret
|
|
55
|
+
})
|
|
56
|
+
};
|
|
57
|
+
const tokenResult = await requestOAuthToken({
|
|
58
|
+
tokenEndpointUrl,
|
|
59
|
+
isDpopEnabled: hubspotConnectEnv.isDpopEnabled,
|
|
60
|
+
...dpopProof !== void 0 ? { dpopProof } : {},
|
|
61
|
+
formParams
|
|
62
|
+
});
|
|
63
|
+
if (!tokenResult.ok) return c.json({ error: `Token refresh failed: ${tokenResult.errorText}` }, 502);
|
|
64
|
+
const { access_token: newAccessToken, refresh_token: newRefreshToken, expires_in } = tokenResult.body;
|
|
65
|
+
if (!newRefreshToken) return c.json({ error: "Token response missing refresh_token" }, 502);
|
|
66
|
+
if (!isPositiveFiniteNumber(expires_in)) return c.json({ error: "Token response missing or invalid expires_in" }, 502);
|
|
67
|
+
setResponseCookie({
|
|
68
|
+
c,
|
|
69
|
+
value: serializeCookie({
|
|
70
|
+
name: HUBSPOT_ACCESS_TOKEN_COOKIE_NAME,
|
|
71
|
+
value: newAccessToken,
|
|
72
|
+
path: "/",
|
|
73
|
+
maxAge: expires_in
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
setResponseCookie({
|
|
77
|
+
c,
|
|
78
|
+
value: serializeCookie({
|
|
79
|
+
name: refreshCookieName,
|
|
80
|
+
value: newRefreshToken,
|
|
81
|
+
path: refreshCookiePath,
|
|
82
|
+
maxAge: REFRESH_COOKIE_MAX_AGE_SEC
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
Object.keys(cookies).forEach((cookieName) => {
|
|
86
|
+
if (cookieName.startsWith("hs_refresh_") && cookieName !== refreshCookieName) setResponseCookie({
|
|
87
|
+
c,
|
|
88
|
+
value: serializeCookie({
|
|
89
|
+
name: cookieName,
|
|
90
|
+
value: "",
|
|
91
|
+
path: refreshCookiePath,
|
|
92
|
+
maxAge: 0
|
|
93
|
+
})
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
return c.json({ expires_in });
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
export { handleAuthRefresh };
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=auth-refresh.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/server/hono/hubspot-connect-routes/cimd-client-metadata-types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Caller-supplied scope configuration for the CIMD document served at
|
|
4
|
+
* `{basePath}/client.json`. `redirect_uri` and `jwks_uri` are derived at
|
|
5
|
+
* request time by the hubspot-connect routes.
|
|
6
|
+
*/
|
|
7
|
+
interface HubSpotConnectCimdClientMetadata {
|
|
8
|
+
scope: HubSpotConnectCimdClientScope;
|
|
9
|
+
}
|
|
10
|
+
interface HubSpotConnectCimdClientScope {
|
|
11
|
+
required: string[];
|
|
12
|
+
optional?: string[];
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { HubSpotConnectCimdClientMetadata };
|
|
16
|
+
//# sourceMappingURL=cimd-client-metadata-types.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/server/hono/hubspot-connect-routes/cimd-client-metadata-types.ts
|
|
2
|
+
function assertHubSpotConnectCimdClientMetadata(value) {
|
|
3
|
+
const required = value.scope?.required;
|
|
4
|
+
if (!(Array.isArray(required) && required.length > 0 && required.every((s) => typeof s === "string" && s.length > 0))) throw new Error("HubSpotConnectCimdClientMetadata.scope.required must be a non-empty array of non-empty strings");
|
|
5
|
+
const optional = value.scope.optional;
|
|
6
|
+
if (optional === void 0) return;
|
|
7
|
+
if (!Array.isArray(optional)) throw new Error("HubSpotConnectCimdClientMetadata.scope.optional must be an array when set");
|
|
8
|
+
if (optional.length > 0 && !optional.every((s) => typeof s === "string" && s.length > 0)) throw new Error("HubSpotConnectCimdClientMetadata.scope.optional entries must be non-empty strings");
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { assertHubSpotConnectCimdClientMetadata };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=cimd-client-metadata-types.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getJwkThumbprint } from "../../utils/jwk-utils.js";
|
|
2
|
+
import { buildHubSpotAppJwksUrlFromRequest, buildOAuthRedirectUriFromRequest } from "./utils.js";
|
|
3
|
+
//#region src/server/hono/hubspot-connect-routes/cimd-public-routes.ts
|
|
4
|
+
async function handleCimdClientJson(c, options) {
|
|
5
|
+
const { cimdClientMetadata, basePath } = options;
|
|
6
|
+
if (!cimdClientMetadata) return c.text("CIMD client metadata is not configured", 500);
|
|
7
|
+
const xForwardedProto = c.req.header("x-forwarded-proto") ?? void 0;
|
|
8
|
+
const xForwardedHost = c.req.header("x-forwarded-host") ?? void 0;
|
|
9
|
+
const requestHostHeader = c.req.header("host") ?? void 0;
|
|
10
|
+
const forwarded = {
|
|
11
|
+
requestUrl: c.req.url,
|
|
12
|
+
basePath,
|
|
13
|
+
xForwardedProto,
|
|
14
|
+
xForwardedHost,
|
|
15
|
+
requestHostHeader
|
|
16
|
+
};
|
|
17
|
+
const body = {
|
|
18
|
+
redirect_uri: buildOAuthRedirectUriFromRequest(forwarded),
|
|
19
|
+
jwks_uri: buildHubSpotAppJwksUrlFromRequest(forwarded),
|
|
20
|
+
scope: cimdClientMetadata.scope
|
|
21
|
+
};
|
|
22
|
+
return c.text(JSON.stringify(body, null, 2), 200, { "Content-Type": "application/json; charset=utf-8" });
|
|
23
|
+
}
|
|
24
|
+
async function handleCimdAppJwks(c, options) {
|
|
25
|
+
const { appKeys, hubspotConnectEnv } = options;
|
|
26
|
+
if (!hubspotConnectEnv.isCimdEnabled) return c.text("Not found", 404);
|
|
27
|
+
if (!appKeys) return c.text("Missing app keys", 503);
|
|
28
|
+
const kid = await getJwkThumbprint({ publicKeyJwk: appKeys.appPublicKeyJwk });
|
|
29
|
+
const jwks = { keys: [{
|
|
30
|
+
...appKeys.appPublicKeyJwk,
|
|
31
|
+
kid,
|
|
32
|
+
use: "sig",
|
|
33
|
+
alg: "ES256",
|
|
34
|
+
key_ops: ["verify"],
|
|
35
|
+
ext: true
|
|
36
|
+
}] };
|
|
37
|
+
return c.json(jwks);
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { handleCimdAppJwks, handleCimdClientJson };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=cimd-public-routes.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/server/hono/hubspot-connect-routes/constants.ts
|
|
2
|
+
const SESSION_MAX_AGE_SEC = 2592e3;
|
|
3
|
+
const OAUTH_TEMP_MAX_AGE_SEC = 3600;
|
|
4
|
+
const REFRESH_COOKIE_MAX_AGE_SEC = 2592e3;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { OAUTH_TEMP_MAX_AGE_SEC, REFRESH_COOKIE_MAX_AGE_SEC, SESSION_MAX_AGE_SEC };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/constants.ts"],"sourcesContent":["export const SESSION_MAX_AGE_SEC = 2592000;\nexport const OAUTH_TEMP_MAX_AGE_SEC = 3600;\nexport const REFRESH_COOKIE_MAX_AGE_SEC = 2592000;\n"],"mappings":";AAAA,MAAa,sBAAsB;AACnC,MAAa,yBAAyB;AACtC,MAAa,6BAA6B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.ts
|
|
2
|
+
/**
|
|
3
|
+
* Builds `scope` and `optional_scope` query values for HubSpot
|
|
4
|
+
* `/oauth/authorize` from in-memory client metadata (same shape as
|
|
5
|
+
* `HubSpotConnectCimdClientMetadata` / `startHubSpotConnectFunction({ client })`).
|
|
6
|
+
*/
|
|
7
|
+
function deriveHubSpotAuthorizeScopesFromClientMetadata(metadata) {
|
|
8
|
+
const required = metadata.scope?.required;
|
|
9
|
+
if (!(Array.isArray(required) && required.length > 0 && required.every((s) => typeof s === "string" && s.length > 0))) return {
|
|
10
|
+
ok: false,
|
|
11
|
+
status: 500,
|
|
12
|
+
message: "Invalid or empty scope.required in client metadata"
|
|
13
|
+
};
|
|
14
|
+
const scope = required.join(" ");
|
|
15
|
+
const optionalRaw = metadata.scope.optional;
|
|
16
|
+
if (optionalRaw == null) return {
|
|
17
|
+
ok: true,
|
|
18
|
+
scope
|
|
19
|
+
};
|
|
20
|
+
if (!Array.isArray(optionalRaw)) return {
|
|
21
|
+
ok: false,
|
|
22
|
+
status: 500,
|
|
23
|
+
message: "Invalid scope.optional in client metadata"
|
|
24
|
+
};
|
|
25
|
+
if (optionalRaw.length === 0) return {
|
|
26
|
+
ok: true,
|
|
27
|
+
scope
|
|
28
|
+
};
|
|
29
|
+
if (!optionalRaw.every((s) => typeof s === "string" && s.length > 0)) return {
|
|
30
|
+
ok: false,
|
|
31
|
+
status: 500,
|
|
32
|
+
message: "Invalid scope.optional in client metadata"
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
ok: true,
|
|
36
|
+
scope,
|
|
37
|
+
optionalScope: optionalRaw.join(" ")
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { deriveHubSpotAuthorizeScopesFromClientMetadata };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=fetch-hubspot-client-metadata.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { assertHubSpotConnectCimdClientMetadata } from "./cimd-client-metadata-types.js";
|
|
2
|
+
import { noopLogger } from "../../shared/logger.js";
|
|
3
|
+
import { handleAuthCallback } from "./auth-callback.js";
|
|
4
|
+
import { handleAuthInitSession } from "./auth-init-session.js";
|
|
5
|
+
import { handleAuthLogout } from "./auth-logout.js";
|
|
6
|
+
import { handleAuthRefresh } from "./auth-refresh.js";
|
|
7
|
+
import { handleCimdAppJwks, handleCimdClientJson } from "./cimd-public-routes.js";
|
|
8
|
+
//#region src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts
|
|
9
|
+
/**
|
|
10
|
+
* Mounts hubspot-connect routes: OAuth (`/auth/...`); `GET /client.json`
|
|
11
|
+
* from `cimdClientMetadata`; `GET /jwks.json` when CIMD is enabled.
|
|
12
|
+
*/
|
|
13
|
+
function registerHubSpotConnectRoutes(options) {
|
|
14
|
+
const { app, appKeys, basePath, hubspotConnectEnv, cimdClientMetadata, logger = noopLogger } = options;
|
|
15
|
+
if (!cimdClientMetadata) throw new Error("registerHubSpotConnectRoutes: cimdClientMetadata is required");
|
|
16
|
+
assertHubSpotConnectCimdClientMetadata(cimdClientMetadata);
|
|
17
|
+
const oauthRouteOptions = {
|
|
18
|
+
appKeys,
|
|
19
|
+
refreshCookiePath: `${basePath}/auth`,
|
|
20
|
+
logger,
|
|
21
|
+
basePath,
|
|
22
|
+
hubspotConnectEnv,
|
|
23
|
+
cimdClientMetadata
|
|
24
|
+
};
|
|
25
|
+
app.get("/client.json", (c) => handleCimdClientJson(c, oauthRouteOptions));
|
|
26
|
+
if (hubspotConnectEnv.isCimdEnabled) app.get("/jwks.json", (c) => handleCimdAppJwks(c, oauthRouteOptions));
|
|
27
|
+
app.get("/auth/init-session", (c) => handleAuthInitSession(c, oauthRouteOptions));
|
|
28
|
+
app.get("/auth/callback", (c) => handleAuthCallback(c, oauthRouteOptions));
|
|
29
|
+
app.post("/auth/refresh", (c) => handleAuthRefresh(c, oauthRouteOptions));
|
|
30
|
+
app.post("/auth/logout", (c) => handleAuthLogout(c, oauthRouteOptions));
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { registerHubSpotConnectRoutes };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=hubspot-connect-routes.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isHubspotCimdEnabled, isHubspotDpopEnabled, requireEnv } from "../../utils/env-utils.js";
|
|
2
|
+
//#region src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts
|
|
3
|
+
/**
|
|
4
|
+
* Reads hubspot-connect environment variables from `process.env` or
|
|
5
|
+
* `Deno.env` and returns a typed object for
|
|
6
|
+
* {@link registerHubSpotConnectRoutes}.
|
|
7
|
+
*/
|
|
8
|
+
function loadHubSpotConnectRoutesEnv() {
|
|
9
|
+
const hubspotAuthorizationEndpoint = requireEnv("HUBSPOT_AUTHORIZATION_ENDPOINT");
|
|
10
|
+
const hubspotOAuthApiOrigin = new URL(requireEnv("HUBSPOT_OAUTH_API_ORIGIN")).origin;
|
|
11
|
+
const isCimdEnabled = isHubspotCimdEnabled();
|
|
12
|
+
const isDpopEnabled = isHubspotDpopEnabled();
|
|
13
|
+
const isAppPrivateKeyRequired = isCimdEnabled || isDpopEnabled;
|
|
14
|
+
if (isCimdEnabled) return {
|
|
15
|
+
hubspotAuthorizationEndpoint,
|
|
16
|
+
hubspotOAuthApiOrigin,
|
|
17
|
+
isCimdEnabled: true,
|
|
18
|
+
isDpopEnabled,
|
|
19
|
+
isAppPrivateKeyRequired
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
hubspotAuthorizationEndpoint,
|
|
23
|
+
hubspotOAuthApiOrigin,
|
|
24
|
+
isCimdEnabled: false,
|
|
25
|
+
isDpopEnabled,
|
|
26
|
+
isAppPrivateKeyRequired,
|
|
27
|
+
hubspotClientId: requireEnv("HUBSPOT_CLIENT_ID"),
|
|
28
|
+
hubspotClientSecret: requireEnv("HUBSPOT_CLIENT_SECRET")
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { loadHubSpotConnectRoutesEnv };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=load-hubspot-connect-routes-env.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { signJwt } from "../../utils/jwt-utils.js";
|
|
2
|
+
import { signDpopProof } from "../../utils/dpop-utils.js";
|
|
3
|
+
//#region src/server/hono/hubspot-connect-routes/oauth-client.ts
|
|
4
|
+
/**
|
|
5
|
+
* Lifetime of the OAuth `client_assertion` JWT in seconds. Short by
|
|
6
|
+
* design — RFC 7521 recommends short-lived assertions, and HubSpot's
|
|
7
|
+
* authorization server rejects assertions older than ~5 minutes.
|
|
8
|
+
*/
|
|
9
|
+
const CLIENT_ASSERTION_TTL_SEC = 60;
|
|
10
|
+
/**
|
|
11
|
+
* The `client_assertion_type` value mandated by RFC 7523 §2.2 for
|
|
12
|
+
* JWT-bearer client authentication.
|
|
13
|
+
*/
|
|
14
|
+
const JWT_BEARER_ASSERTION_TYPE = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
|
|
15
|
+
/**
|
|
16
|
+
* Mints a short-lived ES256 JWT used as the `client_assertion`
|
|
17
|
+
* parameter when calling HubSpot's token endpoint, per RFC 7523.
|
|
18
|
+
*/
|
|
19
|
+
async function buildClientAssertion(options) {
|
|
20
|
+
const { appKeys, clientId, audience } = options;
|
|
21
|
+
return signJwt({
|
|
22
|
+
privateKey: appKeys.appPrivateKey,
|
|
23
|
+
payload: {
|
|
24
|
+
iss: clientId,
|
|
25
|
+
sub: clientId,
|
|
26
|
+
aud: audience,
|
|
27
|
+
jti: crypto.randomUUID()
|
|
28
|
+
},
|
|
29
|
+
ttlSeconds: CLIENT_ASSERTION_TTL_SEC
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Signs a DPoP proof for a `POST` to HubSpot's token endpoint. RFC 9449
|
|
34
|
+
* binds the resulting access token to the proving public key so that
|
|
35
|
+
* later API calls must come from the same key holder.
|
|
36
|
+
*/
|
|
37
|
+
async function buildTokenEndpointDpopProof(options) {
|
|
38
|
+
const { appKeys, tokenEndpointUrl, sessionIdHash } = options;
|
|
39
|
+
return signDpopProof({
|
|
40
|
+
appKeys,
|
|
41
|
+
claims: {
|
|
42
|
+
htm: "POST",
|
|
43
|
+
htu: tokenEndpointUrl,
|
|
44
|
+
jti: crypto.randomUUID(),
|
|
45
|
+
iat: Math.floor(Date.now() / 1e3),
|
|
46
|
+
sid: sessionIdHash
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* POSTs an `application/x-www-form-urlencoded` body to a HubSpot token
|
|
52
|
+
* endpoint. Attaches a `DPoP` header when `isDpopEnabled` is true and
|
|
53
|
+
* `dpopProof` is provided. Reads the response once — either
|
|
54
|
+
* as JSON on success or as text on failure — so callers never have to
|
|
55
|
+
* consume the body twice.
|
|
56
|
+
*/
|
|
57
|
+
async function requestOAuthToken(options) {
|
|
58
|
+
const { tokenEndpointUrl, formParams, dpopProof, isDpopEnabled } = options;
|
|
59
|
+
const headers = { "Content-Type": "application/x-www-form-urlencoded" };
|
|
60
|
+
if (isDpopEnabled) {
|
|
61
|
+
if (!dpopProof) throw new Error("DPoP proof is required when DPoP is enabled");
|
|
62
|
+
headers.DPoP = dpopProof;
|
|
63
|
+
}
|
|
64
|
+
const tokenResponse = await fetch(tokenEndpointUrl, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers,
|
|
67
|
+
body: new URLSearchParams(formParams)
|
|
68
|
+
});
|
|
69
|
+
if (!tokenResponse.ok) {
|
|
70
|
+
const errorText = await tokenResponse.text();
|
|
71
|
+
return {
|
|
72
|
+
ok: false,
|
|
73
|
+
status: tokenResponse.status,
|
|
74
|
+
errorText
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
ok: true,
|
|
79
|
+
body: await tokenResponse.json()
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Form parameters always present on the OAuth `client_assertion` flow.
|
|
84
|
+
* Spread into the call site's `formParams`.
|
|
85
|
+
*/
|
|
86
|
+
function buildClientAssertionFormParams(input) {
|
|
87
|
+
const { clientId, clientAssertion } = input;
|
|
88
|
+
return {
|
|
89
|
+
client_id: clientId,
|
|
90
|
+
client_assertion_type: JWT_BEARER_ASSERTION_TYPE,
|
|
91
|
+
client_assertion: clientAssertion
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function buildClientSecretFormParams(options) {
|
|
95
|
+
const { clientId, clientSecret } = options;
|
|
96
|
+
return {
|
|
97
|
+
client_id: clientId,
|
|
98
|
+
client_secret: clientSecret
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
export { buildClientAssertion, buildClientAssertionFormParams, buildClientSecretFormParams, buildTokenEndpointDpopProof, requestOAuthToken };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=oauth-client.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { serializeCookie } from "../utils/cookie-utils.js";
|
|
2
|
+
//#region src/server/hono/hubspot-connect-routes/utils.ts
|
|
3
|
+
function clearTempCookie(name) {
|
|
4
|
+
return serializeCookie({
|
|
5
|
+
name,
|
|
6
|
+
value: "",
|
|
7
|
+
path: "/",
|
|
8
|
+
sameSite: "Lax",
|
|
9
|
+
maxAge: 0
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function isSafeReturnPath(rawPath) {
|
|
13
|
+
if (!rawPath.startsWith("/")) return false;
|
|
14
|
+
if (rawPath.includes("\0")) return false;
|
|
15
|
+
let decoded;
|
|
16
|
+
try {
|
|
17
|
+
decoded = decodeURIComponent(rawPath);
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (!decoded.startsWith("/")) return false;
|
|
22
|
+
const second = decoded.charAt(1);
|
|
23
|
+
if (second === "/" || second === "\\") return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
function normalizeHubSpotConnectBasePath(basePath) {
|
|
27
|
+
return basePath.endsWith("/") && basePath.length > 1 ? basePath.slice(0, -1) : basePath;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Public origin for hubspot-connect URLs (`redirect_uri`, CIMD `client_id`,
|
|
31
|
+
* `jwks_uri`). Matches the host/proto rules used for the OAuth callback.
|
|
32
|
+
*/
|
|
33
|
+
function buildHubSpotConnectRequestOrigin(options) {
|
|
34
|
+
const { requestUrl, xForwardedProto, xForwardedHost, requestHostHeader } = options;
|
|
35
|
+
const proto = xForwardedProto?.split(",")[0]?.trim();
|
|
36
|
+
if (proto && (proto === "http" || proto === "https")) {
|
|
37
|
+
const forwardedHost = xForwardedHost?.split(",")[0]?.trim();
|
|
38
|
+
const hostHeader = requestHostHeader?.split(",")[0]?.trim();
|
|
39
|
+
return `${proto}://${forwardedHost || hostHeader || new URL(requestUrl).host}`;
|
|
40
|
+
}
|
|
41
|
+
return new URL(requestUrl).origin;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* OAuth `redirect_uri` for the hubspot-connect callback. Uses
|
|
45
|
+
* `X-Forwarded-Proto` with `X-Forwarded-Host`, then `Host`, then the request URL
|
|
46
|
+
* host when the proto is forwarded (reverse proxy); otherwise the request URL
|
|
47
|
+
* origin.
|
|
48
|
+
*/
|
|
49
|
+
function buildOAuthRedirectUriFromRequest(options) {
|
|
50
|
+
const trimmed = normalizeHubSpotConnectBasePath(options.basePath);
|
|
51
|
+
return `${buildHubSpotConnectRequestOrigin(options)}${trimmed}/auth/callback`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* CIMD `client_id` URL: `{origin}{basePath}/client.json`.
|
|
55
|
+
*/
|
|
56
|
+
function buildCimdClientIdUrlFromRequest(options) {
|
|
57
|
+
const trimmed = normalizeHubSpotConnectBasePath(options.basePath);
|
|
58
|
+
return `${buildHubSpotConnectRequestOrigin(options)}${trimmed}/client.json`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* App JWKS URL published in CIMD: `{origin}{basePath}/jwks.json`.
|
|
62
|
+
*/
|
|
63
|
+
function buildHubSpotAppJwksUrlFromRequest(options) {
|
|
64
|
+
const trimmed = normalizeHubSpotConnectBasePath(options.basePath);
|
|
65
|
+
return `${buildHubSpotConnectRequestOrigin(options)}${trimmed}/jwks.json`;
|
|
66
|
+
}
|
|
67
|
+
function isPositiveFiniteNumber(value) {
|
|
68
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { buildCimdClientIdUrlFromRequest, buildHubSpotAppJwksUrlFromRequest, buildOAuthRedirectUriFromRequest, clearTempCookie, isPositiveFiniteNumber, isSafeReturnPath };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../src/server/hono/hubspot-connect-routes/utils.ts"],"sourcesContent":["import { serializeCookie } from '../utils/cookie-utils.ts';\n\nexport function clearTempCookie(name: string): string {\n return serializeCookie({\n name,\n value: '',\n path: '/',\n sameSite: 'Lax',\n maxAge: 0,\n });\n}\n\nexport function isSafeReturnPath(rawPath: string): boolean {\n if (!rawPath.startsWith('/')) return false;\n if (rawPath.includes('\\0')) return false;\n let decoded: string;\n try {\n decoded = decodeURIComponent(rawPath);\n } catch {\n return false;\n }\n if (!decoded.startsWith('/')) return false;\n const second = decoded.charAt(1);\n if (second === '/' || second === '\\\\') return false;\n return true;\n}\n\nexport function getRequestHost(requestUrl: string): string {\n return new URL(requestUrl).host;\n}\n\nexport interface GetRequestHostForHubspotConnectOptions {\n requestUrl: string;\n xForwardedHost?: string | undefined;\n /** `Host` when `X-Forwarded-Host` is absent (some proxies only set `X-Forwarded-Proto`). */\n requestHostHeader?: string | undefined;\n}\n\n/**\n * Host for CIMD `client_id` URLs when hubspot-connect sits behind a reverse\n * proxy (e.g. Vite → Deno): prefers `X-Forwarded-Host`, then `Host`, then the\n * request URL host.\n */\nexport function getRequestHostForHubspotConnect(\n options: GetRequestHostForHubspotConnectOptions\n): string {\n const rawForwarded = options.xForwardedHost?.split(',')[0]?.trim();\n if (rawForwarded) {\n try {\n return new URL(`https://${rawForwarded}`).host;\n } catch {\n /* invalid forwarded host */\n }\n }\n const rawHost = options.requestHostHeader?.split(',')[0]?.trim();\n if (rawHost) {\n try {\n return new URL(`https://${rawHost}`).host;\n } catch {\n /* invalid host header */\n }\n }\n return getRequestHost(options.requestUrl);\n}\n\nexport interface BuildOAuthRedirectUriFromRequestOptions {\n requestUrl: string;\n basePath: string;\n xForwardedProto?: string | undefined;\n xForwardedHost?: string | undefined;\n /** `Host` when `X-Forwarded-Host` is absent but `X-Forwarded-Proto` is set. */\n requestHostHeader?: string | undefined;\n}\n\nfunction normalizeHubSpotConnectBasePath(basePath: string): string {\n return basePath.endsWith('/') && basePath.length > 1\n ? basePath.slice(0, -1)\n : basePath;\n}\n\n/**\n * Public origin for hubspot-connect URLs (`redirect_uri`, CIMD `client_id`,\n * `jwks_uri`). Matches the host/proto rules used for the OAuth callback.\n */\nexport function buildHubSpotConnectRequestOrigin(\n options: BuildOAuthRedirectUriFromRequestOptions\n): string {\n const { requestUrl, xForwardedProto, xForwardedHost, requestHostHeader } =\n options;\n const proto = xForwardedProto?.split(',')[0]?.trim();\n if (proto && (proto === 'http' || proto === 'https')) {\n const forwardedHost = xForwardedHost?.split(',')[0]?.trim();\n const hostHeader = requestHostHeader?.split(',')[0]?.trim();\n const hostPart = forwardedHost || hostHeader || new URL(requestUrl).host;\n return `${proto}://${hostPart}`;\n }\n return new URL(requestUrl).origin;\n}\n\n/**\n * OAuth `redirect_uri` for the hubspot-connect callback. Uses\n * `X-Forwarded-Proto` with `X-Forwarded-Host`, then `Host`, then the request URL\n * host when the proto is forwarded (reverse proxy); otherwise the request URL\n * origin.\n */\nexport function buildOAuthRedirectUriFromRequest(\n options: BuildOAuthRedirectUriFromRequestOptions\n): string {\n const trimmed = normalizeHubSpotConnectBasePath(options.basePath);\n const origin = buildHubSpotConnectRequestOrigin(options);\n return `${origin}${trimmed}/auth/callback`;\n}\n\n/**\n * CIMD `client_id` URL: `{origin}{basePath}/client.json`.\n */\nexport function buildCimdClientIdUrlFromRequest(\n options: BuildOAuthRedirectUriFromRequestOptions\n): string {\n const trimmed = normalizeHubSpotConnectBasePath(options.basePath);\n const origin = buildHubSpotConnectRequestOrigin(options);\n return `${origin}${trimmed}/client.json`;\n}\n\n/**\n * App JWKS URL published in CIMD: `{origin}{basePath}/jwks.json`.\n */\nexport function buildHubSpotAppJwksUrlFromRequest(\n options: BuildOAuthRedirectUriFromRequestOptions\n): string {\n const trimmed = normalizeHubSpotConnectBasePath(options.basePath);\n const origin = buildHubSpotConnectRequestOrigin(options);\n return `${origin}${trimmed}/jwks.json`;\n}\n\nexport function isPositiveFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n"],"mappings":";;AAEA,SAAgB,gBAAgB,MAAsB;CACpD,OAAO,gBAAgB;EACrB;EACA,OAAO;EACP,MAAM;EACN,UAAU;EACV,QAAQ;EACT,CAAC;;AAGJ,SAAgB,iBAAiB,SAA0B;CACzD,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,OAAO;CACrC,IAAI,QAAQ,SAAS,KAAK,EAAE,OAAO;CACnC,IAAI;CACJ,IAAI;EACF,UAAU,mBAAmB,QAAQ;SAC/B;EACN,OAAO;;CAET,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,OAAO;CACrC,MAAM,SAAS,QAAQ,OAAO,EAAE;CAChC,IAAI,WAAW,OAAO,WAAW,MAAM,OAAO;CAC9C,OAAO;;AAkDT,SAAS,gCAAgC,UAA0B;CACjE,OAAO,SAAS,SAAS,IAAI,IAAI,SAAS,SAAS,IAC/C,SAAS,MAAM,GAAG,GAAG,GACrB;;;;;;AAON,SAAgB,iCACd,SACQ;CACR,MAAM,EAAE,YAAY,iBAAiB,gBAAgB,sBACnD;CACF,MAAM,QAAQ,iBAAiB,MAAM,IAAI,CAAC,IAAI,MAAM;CACpD,IAAI,UAAU,UAAU,UAAU,UAAU,UAAU;EACpD,MAAM,gBAAgB,gBAAgB,MAAM,IAAI,CAAC,IAAI,MAAM;EAC3D,MAAM,aAAa,mBAAmB,MAAM,IAAI,CAAC,IAAI,MAAM;EAE3D,OAAO,GAAG,MAAM,KADC,iBAAiB,cAAc,IAAI,IAAI,WAAW,CAAC;;CAGtE,OAAO,IAAI,IAAI,WAAW,CAAC;;;;;;;;AAS7B,SAAgB,iCACd,SACQ;CACR,MAAM,UAAU,gCAAgC,QAAQ,SAAS;CAEjE,OAAO,GADQ,iCAAiC,QAChC,GAAG,QAAQ;;;;;AAM7B,SAAgB,gCACd,SACQ;CACR,MAAM,UAAU,gCAAgC,QAAQ,SAAS;CAEjE,OAAO,GADQ,iCAAiC,QAChC,GAAG,QAAQ;;;;;AAM7B,SAAgB,kCACd,SACQ;CACR,MAAM,UAAU,gCAAgC,QAAQ,SAAS;CAEjE,OAAO,GADQ,iCAAiC,QAChC,GAAG,QAAQ;;AAG7B,SAAgB,uBAAuB,OAAiC;CACtE,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,QAAQ"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { HubSpotClient } from "../api-client-core/types.js";
|
|
2
|
+
import { HubSpotProxy } from "../types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/hono/types.d.ts
|
|
5
|
+
interface AppConnectHonoBindings {
|
|
6
|
+
/**
|
|
7
|
+
* Authenticated proxy that issues DPoP-bound calls to HubSpot's
|
|
8
|
+
* API on behalf of the browser session that made the inbound
|
|
9
|
+
* request. `authenticated: false` when the session cookies are
|
|
10
|
+
* absent or invalid.
|
|
11
|
+
*/
|
|
12
|
+
hubSpotProxy: HubSpotProxy;
|
|
13
|
+
/**
|
|
14
|
+
* Authenticated HubSpot API client.
|
|
15
|
+
*/
|
|
16
|
+
hubSpotClient: HubSpotClient;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hono environment shape used by handlers running inside a hubspot-
|
|
20
|
+
* connect request handler. Exposes the per-request
|
|
21
|
+
* {@link HubSpotProxy} as `c.env.hubSpotProxy`.
|
|
22
|
+
*/
|
|
23
|
+
interface AppConnectHonoEnv {
|
|
24
|
+
Bindings: AppConnectHonoBindings;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { AppConnectHonoEnv };
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/server/hono/utils/cookie-utils.ts
|
|
2
|
+
/**
|
|
3
|
+
* Appends a `Set-Cookie` header to the response. Hono replaces single
|
|
4
|
+
* headers by default, so this uses `{ append: true }` to emit multiple
|
|
5
|
+
* cookies on the same response.
|
|
6
|
+
*/
|
|
7
|
+
function setResponseCookie(options) {
|
|
8
|
+
const { c, value } = options;
|
|
9
|
+
c.header("Set-Cookie", value, { append: true });
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds a `Set-Cookie` header value with HubSpot's default attributes
|
|
13
|
+
* (HttpOnly, Secure, SameSite). Centralizes the serialization so all
|
|
14
|
+
* cookies share the same policy.
|
|
15
|
+
*/
|
|
16
|
+
function serializeCookie(options) {
|
|
17
|
+
const { name, value, path, sameSite = "Strict", maxAge, secure = true, httpOnly = true } = options;
|
|
18
|
+
const parts = [`${name}=${value}`];
|
|
19
|
+
if (httpOnly) parts.push("HttpOnly");
|
|
20
|
+
if (secure) parts.push("Secure");
|
|
21
|
+
parts.push(`SameSite=${sameSite}`);
|
|
22
|
+
parts.push(`Path=${path}`);
|
|
23
|
+
parts.push(`Max-Age=${maxAge}`);
|
|
24
|
+
return parts.join("; ");
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { serializeCookie, setResponseCookie };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=cookie-utils.js.map
|