@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,21 @@
|
|
|
1
|
+
//#region src/server/utils/cookie-utils.ts
|
|
2
|
+
/**
|
|
3
|
+
* Parses an HTTP `Cookie` request header into a `name -> value` map.
|
|
4
|
+
* Tolerates leading/trailing whitespace, missing `=` (treats the
|
|
5
|
+
* cookie value as empty), and duplicate names (last write wins).
|
|
6
|
+
*
|
|
7
|
+
* Returns an empty object when `cookieHeader` is `null`/`undefined`
|
|
8
|
+
* /empty so callers don't have to null-check the input.
|
|
9
|
+
*/
|
|
10
|
+
function parseCookies(cookieHeader) {
|
|
11
|
+
if (!cookieHeader) return {};
|
|
12
|
+
return Object.fromEntries(cookieHeader.split(";").map((pair) => {
|
|
13
|
+
const eqIdx = pair.indexOf("=");
|
|
14
|
+
if (eqIdx === -1) return [pair.trim(), ""];
|
|
15
|
+
return [pair.slice(0, eqIdx).trim(), pair.slice(eqIdx + 1).trim()];
|
|
16
|
+
}).filter(([name]) => name.length > 0));
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { parseCookies };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=cookie-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-utils.js","names":[],"sources":["../../../src/server/utils/cookie-utils.ts"],"sourcesContent":["/**\n * Parses an HTTP `Cookie` request header into a `name -> value` map.\n * Tolerates leading/trailing whitespace, missing `=` (treats the\n * cookie value as empty), and duplicate names (last write wins).\n *\n * Returns an empty object when `cookieHeader` is `null`/`undefined`\n * /empty so callers don't have to null-check the input.\n */\nexport function parseCookies(\n cookieHeader: string | null | undefined\n): Record<string, string> {\n if (!cookieHeader) return {};\n return Object.fromEntries(\n cookieHeader\n .split(';')\n .map((pair) => {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) return [pair.trim(), ''] as [string, string];\n return [pair.slice(0, eqIdx).trim(), pair.slice(eqIdx + 1).trim()] as [\n string,\n string,\n ];\n })\n .filter(([name]) => name.length > 0)\n );\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,aACd,cACwB;CACxB,IAAI,CAAC,cAAc,OAAO,EAAE;CAC5B,OAAO,OAAO,YACZ,aACG,MAAM,IAAI,CACV,KAAK,SAAS;EACb,MAAM,QAAQ,KAAK,QAAQ,IAAI;EAC/B,IAAI,UAAU,IAAI,OAAO,CAAC,KAAK,MAAM,EAAE,GAAG;EAC1C,OAAO,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ,EAAE,CAAC,MAAM,CAAC;GAIlE,CACD,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CACvC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//#region src/server/utils/dpop-utils.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Claims that go into a DPoP proof JWT (RFC 9449 §4.2). Extra
|
|
4
|
+
* properties pass through to the encoder unchanged so callers can
|
|
5
|
+
* include implementation-specific claims.
|
|
6
|
+
*/
|
|
7
|
+
interface DpopClaims {
|
|
8
|
+
/** HTTP method of the protected request, uppercase. */
|
|
9
|
+
htm: string;
|
|
10
|
+
/** Target URI of the protected request, fully-qualified. */
|
|
11
|
+
htu: string;
|
|
12
|
+
/** Unique proof identifier (RFC 9449 §4.2, recommended UUID). */
|
|
13
|
+
jti: string;
|
|
14
|
+
/** Issuance time, Unix epoch seconds. */
|
|
15
|
+
iat: number;
|
|
16
|
+
/**
|
|
17
|
+
* Hash of the access token presented alongside this proof, if any
|
|
18
|
+
* (RFC 9449 §4.2). Required for resource-server DPoP.
|
|
19
|
+
*/
|
|
20
|
+
ath?: string;
|
|
21
|
+
/**
|
|
22
|
+
* App session ID hash. Custom HubSpot extension that lets the auth
|
|
23
|
+
* server bind tokens to the browser session that minted them.
|
|
24
|
+
*/
|
|
25
|
+
sid?: string;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Result of a successful {@link verifyDpopProof} call.
|
|
30
|
+
*/
|
|
31
|
+
interface VerifiedDpopProof {
|
|
32
|
+
/** Public JWK extracted from the proof's header. */
|
|
33
|
+
publicKeyJwk: JsonWebKey;
|
|
34
|
+
/** RFC 7638 JWK thumbprint of `publicKeyJwk`. */
|
|
35
|
+
jkt: string;
|
|
36
|
+
/** Decoded claims from the proof's payload. */
|
|
37
|
+
claims: DpopClaims;
|
|
38
|
+
}
|
|
39
|
+
interface VerifyDpopProofOptions {
|
|
40
|
+
/** The compact-serialized DPoP proof. */
|
|
41
|
+
proof: string;
|
|
42
|
+
/** Expected HTTP method (RFC 9449 `htm` claim). */
|
|
43
|
+
htm: string;
|
|
44
|
+
/** Expected request URI (RFC 9449 `htu` claim). */
|
|
45
|
+
htu: string;
|
|
46
|
+
/** Expected access-token hash (RFC 9449 `ath` claim). */
|
|
47
|
+
ath?: string;
|
|
48
|
+
/** Expected app-session-ID hash (`sid` claim). */
|
|
49
|
+
sid?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Verifies a DPoP proof JWT and returns the embedded public JWK,
|
|
53
|
+
* its thumbprint, and the decoded claims.
|
|
54
|
+
*
|
|
55
|
+
* Enforces RFC 9449's required checks:
|
|
56
|
+
*
|
|
57
|
+
* - `typ=dpop+jwt`, `alg=ES256`, and a JWK in the header.
|
|
58
|
+
* - Signature is valid against the embedded JWK.
|
|
59
|
+
* - `htm`, `htu`, and (when supplied) `ath`/`sid` match.
|
|
60
|
+
* - `iat` is within ±5 minutes of "now".
|
|
61
|
+
*
|
|
62
|
+
* @throws {Error} If any of the above checks fail.
|
|
63
|
+
*/
|
|
64
|
+
declare function verifyDpopProof(options: VerifyDpopProofOptions): Promise<VerifiedDpopProof>;
|
|
65
|
+
//#endregion
|
|
66
|
+
export { verifyDpopProof };
|
|
67
|
+
//# sourceMappingURL=dpop-utils.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { base64urlDecode } from "../shared/encoding/base64.js";
|
|
2
|
+
import { getJwkThumbprint } from "./jwk-utils.js";
|
|
3
|
+
import { decodeAndVerifyJwt, encodeAndSignJwt } from "./jwt-utils.js";
|
|
4
|
+
//#region src/server/utils/dpop-utils.ts
|
|
5
|
+
function ecPublicJwkForDpopHeader(jwk) {
|
|
6
|
+
if (jwk.kty !== "EC" || jwk.crv !== "P-256" || typeof jwk.x !== "string" || typeof jwk.y !== "string") throw new Error("Expected P-256 EC public JWK");
|
|
7
|
+
return {
|
|
8
|
+
kty: "EC",
|
|
9
|
+
crv: "P-256",
|
|
10
|
+
x: jwk.x,
|
|
11
|
+
y: jwk.y
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Mints a DPoP proof JWT (RFC 9449) signed with the app's private
|
|
16
|
+
* key. The header is set to `typ=dpop+jwt`, `alg=ES256`, and embeds
|
|
17
|
+
* the public JWK so the receiver can verify the signature without
|
|
18
|
+
* out-of-band key distribution.
|
|
19
|
+
*/
|
|
20
|
+
async function signDpopProof(options) {
|
|
21
|
+
const { appKeys, claims } = options;
|
|
22
|
+
return encodeAndSignJwt({
|
|
23
|
+
header: {
|
|
24
|
+
alg: "ES256",
|
|
25
|
+
typ: "dpop+jwt",
|
|
26
|
+
jwk: ecPublicJwkForDpopHeader(appKeys.appPublicKeyJwk)
|
|
27
|
+
},
|
|
28
|
+
payload: claims,
|
|
29
|
+
privateKey: appKeys.appPrivateKey
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Verifies a DPoP proof JWT and returns the embedded public JWK,
|
|
34
|
+
* its thumbprint, and the decoded claims.
|
|
35
|
+
*
|
|
36
|
+
* Enforces RFC 9449's required checks:
|
|
37
|
+
*
|
|
38
|
+
* - `typ=dpop+jwt`, `alg=ES256`, and a JWK in the header.
|
|
39
|
+
* - Signature is valid against the embedded JWK.
|
|
40
|
+
* - `htm`, `htu`, and (when supplied) `ath`/`sid` match.
|
|
41
|
+
* - `iat` is within ±5 minutes of "now".
|
|
42
|
+
*
|
|
43
|
+
* @throws {Error} If any of the above checks fail.
|
|
44
|
+
*/
|
|
45
|
+
async function verifyDpopProof(options) {
|
|
46
|
+
const { proof, htm, htu, ath, sid } = options;
|
|
47
|
+
const parts = proof.split(".");
|
|
48
|
+
if (parts.length !== 3) throw new Error("Invalid DPoP proof format");
|
|
49
|
+
const encodedHeader = parts[0];
|
|
50
|
+
if (!encodedHeader) throw new Error("Missing DPoP header");
|
|
51
|
+
const header = JSON.parse(new TextDecoder().decode(base64urlDecode(encodedHeader)));
|
|
52
|
+
if (header.typ !== "dpop+jwt") throw new Error("Invalid DPoP typ header");
|
|
53
|
+
if (header.alg !== "ES256") throw new Error("Unsupported DPoP algorithm");
|
|
54
|
+
const publicKeyJwk = header.jwk;
|
|
55
|
+
if (!publicKeyJwk) throw new Error("Missing jwk in DPoP header");
|
|
56
|
+
const claims = await decodeAndVerifyJwt({
|
|
57
|
+
token: proof,
|
|
58
|
+
publicKeyJwk
|
|
59
|
+
});
|
|
60
|
+
if (claims.htm !== htm) throw new Error(`DPoP htm mismatch: expected ${htm}, got ${claims.htm}`);
|
|
61
|
+
if (claims.htu !== htu) throw new Error(`DPoP htu mismatch: expected ${htu}, got ${claims.htu}`);
|
|
62
|
+
if (ath !== void 0 && claims.ath !== ath) throw new Error("DPoP ath mismatch");
|
|
63
|
+
if (sid !== void 0 && claims.sid !== sid) throw new Error("DPoP sid mismatch");
|
|
64
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
65
|
+
if (Math.abs(now - claims.iat) > 300) throw new Error("DPoP proof expired or too far in future");
|
|
66
|
+
return {
|
|
67
|
+
publicKeyJwk,
|
|
68
|
+
jkt: await getJwkThumbprint({ publicKeyJwk }),
|
|
69
|
+
claims
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
export { signDpopProof, verifyDpopProof };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=dpop-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop-utils.js","names":[],"sources":["../../../src/server/utils/dpop-utils.ts"],"sourcesContent":["import { type AppKeys } from '../types.ts';\nimport { base64urlDecode } from './base64-utils.ts';\nimport { getJwkThumbprint } from './jwk-utils.ts';\nimport { decodeAndVerifyJwt, encodeAndSignJwt } from './jwt-utils.ts';\n\n/**\n * Claims that go into a DPoP proof JWT (RFC 9449 §4.2). Extra\n * properties pass through to the encoder unchanged so callers can\n * include implementation-specific claims.\n */\nexport interface DpopClaims {\n /** HTTP method of the protected request, uppercase. */\n htm: string;\n /** Target URI of the protected request, fully-qualified. */\n htu: string;\n /** Unique proof identifier (RFC 9449 §4.2, recommended UUID). */\n jti: string;\n /** Issuance time, Unix epoch seconds. */\n iat: number;\n /**\n * Hash of the access token presented alongside this proof, if any\n * (RFC 9449 §4.2). Required for resource-server DPoP.\n */\n ath?: string;\n /**\n * App session ID hash. Custom HubSpot extension that lets the auth\n * server bind tokens to the browser session that minted them.\n */\n sid?: string;\n [key: string]: unknown;\n}\n\nfunction ecPublicJwkForDpopHeader(jwk: JsonWebKey): JsonWebKey {\n if (\n jwk.kty !== 'EC' ||\n jwk.crv !== 'P-256' ||\n typeof jwk.x !== 'string' ||\n typeof jwk.y !== 'string'\n ) {\n throw new Error('Expected P-256 EC public JWK');\n }\n return {\n kty: 'EC',\n crv: 'P-256',\n x: jwk.x,\n y: jwk.y,\n };\n}\n\nexport interface SignDpopProofOptions {\n /** App key material produced by `secureStart`. */\n appKeys: AppKeys;\n /** Claims to include in the DPoP proof. */\n claims: DpopClaims;\n}\n\n/**\n * Mints a DPoP proof JWT (RFC 9449) signed with the app's private\n * key. The header is set to `typ=dpop+jwt`, `alg=ES256`, and embeds\n * the public JWK so the receiver can verify the signature without\n * out-of-band key distribution.\n */\nexport async function signDpopProof(\n options: SignDpopProofOptions\n): Promise<string> {\n const { appKeys, claims } = options;\n const publicJwk = ecPublicJwkForDpopHeader(appKeys.appPublicKeyJwk);\n return encodeAndSignJwt({\n header: { alg: 'ES256', typ: 'dpop+jwt', jwk: publicJwk },\n payload: claims,\n privateKey: appKeys.appPrivateKey,\n });\n}\n\n/**\n * Result of a successful {@link verifyDpopProof} call.\n */\nexport interface VerifiedDpopProof {\n /** Public JWK extracted from the proof's header. */\n publicKeyJwk: JsonWebKey;\n /** RFC 7638 JWK thumbprint of `publicKeyJwk`. */\n jkt: string;\n /** Decoded claims from the proof's payload. */\n claims: DpopClaims;\n}\n\nexport interface VerifyDpopProofOptions {\n /** The compact-serialized DPoP proof. */\n proof: string;\n /** Expected HTTP method (RFC 9449 `htm` claim). */\n htm: string;\n /** Expected request URI (RFC 9449 `htu` claim). */\n htu: string;\n /** Expected access-token hash (RFC 9449 `ath` claim). */\n ath?: string;\n /** Expected app-session-ID hash (`sid` claim). */\n sid?: string;\n}\n\ninterface DpopProofHeader {\n typ?: string;\n alg?: string;\n jwk?: JsonWebKey;\n}\n\n/**\n * Verifies a DPoP proof JWT and returns the embedded public JWK,\n * its thumbprint, and the decoded claims.\n *\n * Enforces RFC 9449's required checks:\n *\n * - `typ=dpop+jwt`, `alg=ES256`, and a JWK in the header.\n * - Signature is valid against the embedded JWK.\n * - `htm`, `htu`, and (when supplied) `ath`/`sid` match.\n * - `iat` is within ±5 minutes of \"now\".\n *\n * @throws {Error} If any of the above checks fail.\n */\nexport async function verifyDpopProof(\n options: VerifyDpopProofOptions\n): Promise<VerifiedDpopProof> {\n const { proof, htm, htu, ath, sid } = options;\n const parts = proof.split('.');\n if (parts.length !== 3) throw new Error('Invalid DPoP proof format');\n\n const encodedHeader = parts[0];\n if (!encodedHeader) throw new Error('Missing DPoP header');\n\n const header = JSON.parse(\n new TextDecoder().decode(base64urlDecode(encodedHeader))\n ) as DpopProofHeader;\n\n if (header.typ !== 'dpop+jwt') throw new Error('Invalid DPoP typ header');\n if (header.alg !== 'ES256') throw new Error('Unsupported DPoP algorithm');\n const publicKeyJwk = header.jwk;\n if (!publicKeyJwk) throw new Error('Missing jwk in DPoP header');\n\n const payload = await decodeAndVerifyJwt({ token: proof, publicKeyJwk });\n const claims = payload as unknown as DpopClaims;\n\n if (claims.htm !== htm) {\n throw new Error(`DPoP htm mismatch: expected ${htm}, got ${claims.htm}`);\n }\n if (claims.htu !== htu) {\n throw new Error(`DPoP htu mismatch: expected ${htu}, got ${claims.htu}`);\n }\n if (ath !== undefined && claims.ath !== ath) {\n throw new Error('DPoP ath mismatch');\n }\n if (sid !== undefined && claims.sid !== sid) {\n throw new Error('DPoP sid mismatch');\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - claims.iat) > 300) {\n throw new Error('DPoP proof expired or too far in future');\n }\n\n const jkt = await getJwkThumbprint({ publicKeyJwk });\n return { publicKeyJwk, jkt, claims };\n}\n"],"mappings":";;;;AAgCA,SAAS,yBAAyB,KAA6B;CAC7D,IACE,IAAI,QAAQ,QACZ,IAAI,QAAQ,WACZ,OAAO,IAAI,MAAM,YACjB,OAAO,IAAI,MAAM,UAEjB,MAAM,IAAI,MAAM,+BAA+B;CAEjD,OAAO;EACL,KAAK;EACL,KAAK;EACL,GAAG,IAAI;EACP,GAAG,IAAI;EACR;;;;;;;;AAgBH,eAAsB,cACpB,SACiB;CACjB,MAAM,EAAE,SAAS,WAAW;CAE5B,OAAO,iBAAiB;EACtB,QAAQ;GAAE,KAAK;GAAS,KAAK;GAAY,KAFzB,yBAAyB,QAAQ,gBAEM;GAAE;EACzD,SAAS;EACT,YAAY,QAAQ;EACrB,CAAC;;;;;;;;;;;;;;;AA+CJ,eAAsB,gBACpB,SAC4B;CAC5B,MAAM,EAAE,OAAO,KAAK,KAAK,KAAK,QAAQ;CACtC,MAAM,QAAQ,MAAM,MAAM,IAAI;CAC9B,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,4BAA4B;CAEpE,MAAM,gBAAgB,MAAM;CAC5B,IAAI,CAAC,eAAe,MAAM,IAAI,MAAM,sBAAsB;CAE1D,MAAM,SAAS,KAAK,MAClB,IAAI,aAAa,CAAC,OAAO,gBAAgB,cAAc,CAAC,CACzD;CAED,IAAI,OAAO,QAAQ,YAAY,MAAM,IAAI,MAAM,0BAA0B;CACzE,IAAI,OAAO,QAAQ,SAAS,MAAM,IAAI,MAAM,6BAA6B;CACzE,MAAM,eAAe,OAAO;CAC5B,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM,6BAA6B;CAGhE,MAAM,SAAS,MADO,mBAAmB;EAAE,OAAO;EAAO;EAAc,CAAC;CAGxE,IAAI,OAAO,QAAQ,KACjB,MAAM,IAAI,MAAM,+BAA+B,IAAI,QAAQ,OAAO,MAAM;CAE1E,IAAI,OAAO,QAAQ,KACjB,MAAM,IAAI,MAAM,+BAA+B,IAAI,QAAQ,OAAO,MAAM;CAE1E,IAAI,QAAQ,KAAA,KAAa,OAAO,QAAQ,KACtC,MAAM,IAAI,MAAM,oBAAoB;CAEtC,IAAI,QAAQ,KAAA,KAAa,OAAO,QAAQ,KACtC,MAAM,IAAI,MAAM,oBAAoB;CAGtC,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CACzC,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GAAG,KAC/B,MAAM,IAAI,MAAM,0CAA0C;CAI5D,OAAO;EAAE;EAAc,KAAA,MADL,iBAAiB,EAAE,cAAc,CAAC;EACxB;EAAQ"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/server/utils/env-utils.ts
|
|
2
|
+
/**
|
|
3
|
+
* Reads an environment variable in a way that works under both Node
|
|
4
|
+
* (`process.env`) and Deno (`Deno.env.get`). Returns `undefined` when
|
|
5
|
+
* the variable is unset or when neither runtime is available.
|
|
6
|
+
*/
|
|
7
|
+
function getEnv(key) {
|
|
8
|
+
const g = globalThis;
|
|
9
|
+
const proc = g.process;
|
|
10
|
+
if (proc?.env) return proc.env[key];
|
|
11
|
+
const deno = g.Deno;
|
|
12
|
+
if (deno !== void 0) return deno.env.get(key);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Reads an environment variable and throws when it is missing or empty.
|
|
16
|
+
* Use for values the SDK cannot fall back on (e.g. upstream service
|
|
17
|
+
* URLs).
|
|
18
|
+
*
|
|
19
|
+
* @throws {Error} When the environment variable is unset or an empty
|
|
20
|
+
* string.
|
|
21
|
+
*/
|
|
22
|
+
function requireEnv(key) {
|
|
23
|
+
const value = getEnv(key);
|
|
24
|
+
if (!value) throw new Error(`Missing required environment variable: ${key}`);
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether outbound HubSpot OAuth and API calls should attach DPoP on
|
|
29
|
+
* the wire. Disabled only when `HUBSPOT_DPOP_ENABLED` is exactly the
|
|
30
|
+
* string `"false"` (unset or any other value keeps DPoP enabled).
|
|
31
|
+
*/
|
|
32
|
+
function isHubspotDpopEnabled() {
|
|
33
|
+
return getEnv("HUBSPOT_DPOP_ENABLED") !== "false";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether the SDK should use CIMD-style OAuth (client ID URL + JWT client
|
|
37
|
+
* assertion). Disabled only when `HUBSPOT_CIMD_ENABLED` is exactly the
|
|
38
|
+
* string `"false"` (unset or any other value keeps CIMD enabled).
|
|
39
|
+
*/
|
|
40
|
+
function isHubspotCimdEnabled() {
|
|
41
|
+
return getEnv("HUBSPOT_CIMD_ENABLED") !== "false";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Whether `HUBSPOT_APP_PRIVATE_KEY` must be set for `secureStart`. False
|
|
45
|
+
* when both CIMD and DPoP are disabled — the SDK then uses
|
|
46
|
+
* `client_secret` for OAuth and Bearer tokens only for API calls.
|
|
47
|
+
*/
|
|
48
|
+
function isHubspotAppPrivateKeyRequired() {
|
|
49
|
+
return isHubspotCimdEnabled() || isHubspotDpopEnabled();
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { isHubspotAppPrivateKeyRequired, isHubspotCimdEnabled, isHubspotDpopEnabled, requireEnv };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=env-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-utils.js","names":[],"sources":["../../../src/server/utils/env-utils.ts"],"sourcesContent":["interface GlobalWithOptionalEnv {\n process?: { env?: Record<string, string | undefined> };\n Deno?: { env: { get(name: string): string | undefined } };\n}\n\n/**\n * Reads an environment variable in a way that works under both Node\n * (`process.env`) and Deno (`Deno.env.get`). Returns `undefined` when\n * the variable is unset or when neither runtime is available.\n */\nexport function getEnv(key: string): string | undefined {\n const g = globalThis as GlobalWithOptionalEnv;\n const proc = g.process;\n if (proc?.env) {\n return proc.env[key];\n }\n const deno = g.Deno;\n if (deno !== undefined) {\n return deno.env.get(key);\n }\n return undefined;\n}\n\n/**\n * Reads an environment variable and throws when it is missing or empty.\n * Use for values the SDK cannot fall back on (e.g. upstream service\n * URLs).\n *\n * @throws {Error} When the environment variable is unset or an empty\n * string.\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (!value) {\n throw new Error(`Missing required environment variable: ${key}`);\n }\n return value;\n}\n\n/**\n * Whether outbound HubSpot OAuth and API calls should attach DPoP on\n * the wire. Disabled only when `HUBSPOT_DPOP_ENABLED` is exactly the\n * string `\"false\"` (unset or any other value keeps DPoP enabled).\n */\nexport function isHubspotDpopEnabled(): boolean {\n return getEnv('HUBSPOT_DPOP_ENABLED') !== 'false';\n}\n\n/**\n * Whether the SDK should use CIMD-style OAuth (client ID URL + JWT client\n * assertion). Disabled only when `HUBSPOT_CIMD_ENABLED` is exactly the\n * string `\"false\"` (unset or any other value keeps CIMD enabled).\n */\nexport function isHubspotCimdEnabled(): boolean {\n return getEnv('HUBSPOT_CIMD_ENABLED') !== 'false';\n}\n\n/**\n * Whether `HUBSPOT_APP_PRIVATE_KEY` must be set for `secureStart`. False\n * when both CIMD and DPoP are disabled — the SDK then uses\n * `client_secret` for OAuth and Bearer tokens only for API calls.\n */\nexport function isHubspotAppPrivateKeyRequired(): boolean {\n return isHubspotCimdEnabled() || isHubspotDpopEnabled();\n}\n"],"mappings":";;;;;;AAUA,SAAgB,OAAO,KAAiC;CACtD,MAAM,IAAI;CACV,MAAM,OAAO,EAAE;CACf,IAAI,MAAM,KACR,OAAO,KAAK,IAAI;CAElB,MAAM,OAAO,EAAE;CACf,IAAI,SAAS,KAAA,GACX,OAAO,KAAK,IAAI,IAAI,IAAI;;;;;;;;;;AAa5B,SAAgB,WAAW,KAAqB;CAC9C,MAAM,QAAQ,OAAO,IAAI;CACzB,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,0CAA0C,MAAM;CAElE,OAAO;;;;;;;AAQT,SAAgB,uBAAgC;CAC9C,OAAO,OAAO,uBAAuB,KAAK;;;;;;;AAQ5C,SAAgB,uBAAgC;CAC9C,OAAO,OAAO,uBAAuB,KAAK;;;;;;;AAQ5C,SAAgB,iCAA0C;CACxD,OAAO,sBAAsB,IAAI,sBAAsB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/server/utils/jwk-utils.d.ts
|
|
2
|
+
interface GetJwkThumbprintOptions {
|
|
3
|
+
/** EC P-256 public JWK whose thumbprint to compute. */
|
|
4
|
+
publicKeyJwk: JsonWebKey;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Computes the RFC 7638 JWK thumbprint of an EC P-256 public JWK.
|
|
8
|
+
* Per §3.2 the canonical form contains only `crv`, `kty`, `x`, `y`,
|
|
9
|
+
* sorted lexicographically — no whitespace, no other members. The
|
|
10
|
+
* SHA-256 of this canonical UTF-8 JSON, base64url-encoded, is the
|
|
11
|
+
* stable identifier (`jkt`) DPoP uses to bind tokens to public keys.
|
|
12
|
+
*/
|
|
13
|
+
declare function getJwkThumbprint(options: GetJwkThumbprintOptions): Promise<string>;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { getJwkThumbprint };
|
|
16
|
+
//# sourceMappingURL=jwk-utils.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { base64url } from "../shared/encoding/base64.js";
|
|
2
|
+
//#region src/server/utils/jwk-utils.ts
|
|
3
|
+
/**
|
|
4
|
+
* Computes the RFC 7638 JWK thumbprint of an EC P-256 public JWK.
|
|
5
|
+
* Per §3.2 the canonical form contains only `crv`, `kty`, `x`, `y`,
|
|
6
|
+
* sorted lexicographically — no whitespace, no other members. The
|
|
7
|
+
* SHA-256 of this canonical UTF-8 JSON, base64url-encoded, is the
|
|
8
|
+
* stable identifier (`jkt`) DPoP uses to bind tokens to public keys.
|
|
9
|
+
*/
|
|
10
|
+
async function getJwkThumbprint(options) {
|
|
11
|
+
const { publicKeyJwk } = options;
|
|
12
|
+
const canonical = JSON.stringify({
|
|
13
|
+
crv: publicKeyJwk.crv,
|
|
14
|
+
kty: publicKeyJwk.kty,
|
|
15
|
+
x: publicKeyJwk.x,
|
|
16
|
+
y: publicKeyJwk.y
|
|
17
|
+
});
|
|
18
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(canonical));
|
|
19
|
+
return base64url(new Uint8Array(digest));
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getJwkThumbprint };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=jwk-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwk-utils.js","names":[],"sources":["../../../src/server/utils/jwk-utils.ts"],"sourcesContent":["import { base64url } from './base64-utils.ts';\n\nexport interface GetJwkThumbprintOptions {\n /** EC P-256 public JWK whose thumbprint to compute. */\n publicKeyJwk: JsonWebKey;\n}\n\n/**\n * Computes the RFC 7638 JWK thumbprint of an EC P-256 public JWK.\n * Per §3.2 the canonical form contains only `crv`, `kty`, `x`, `y`,\n * sorted lexicographically — no whitespace, no other members. The\n * SHA-256 of this canonical UTF-8 JSON, base64url-encoded, is the\n * stable identifier (`jkt`) DPoP uses to bind tokens to public keys.\n */\nexport async function getJwkThumbprint(\n options: GetJwkThumbprintOptions\n): Promise<string> {\n const { publicKeyJwk } = options;\n const canonical = JSON.stringify({\n crv: publicKeyJwk.crv,\n kty: publicKeyJwk.kty,\n x: publicKeyJwk.x,\n y: publicKeyJwk.y,\n });\n const digest = await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(canonical)\n );\n return base64url(new Uint8Array(digest));\n}\n"],"mappings":";;;;;;;;;AAcA,eAAsB,iBACpB,SACiB;CACjB,MAAM,EAAE,iBAAiB;CACzB,MAAM,YAAY,KAAK,UAAU;EAC/B,KAAK,aAAa;EAClB,KAAK,aAAa;EAClB,GAAG,aAAa;EAChB,GAAG,aAAa;EACjB,CAAC;CACF,MAAM,SAAS,MAAM,OAAO,OAAO,OACjC,WACA,IAAI,aAAa,CAAC,OAAO,UAAU,CACpC;CACD,OAAO,UAAU,IAAI,WAAW,OAAO,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//#region src/server/utils/jwt-utils.d.ts
|
|
2
|
+
interface VerifyJwtOptions {
|
|
3
|
+
/** Compact-serialized JWT to verify. */
|
|
4
|
+
token: string;
|
|
5
|
+
/** Public key in JWK form. Caller is responsible for trusting it. */
|
|
6
|
+
publicKeyJwk: JsonWebKey;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Verifies signature and (if present) `exp` (RFC 7519 §4.1.4) on a
|
|
10
|
+
* JWT and returns its payload.
|
|
11
|
+
*
|
|
12
|
+
* @throws {Error} When the signature fails or when `exp` has passed.
|
|
13
|
+
*/
|
|
14
|
+
declare function verifyJwt(options: VerifyJwtOptions): Promise<Record<string, unknown>>;
|
|
15
|
+
interface SignJwtOptions {
|
|
16
|
+
/** ES256 private key as a non-extractable WebCrypto key. */
|
|
17
|
+
privateKey: CryptoKey;
|
|
18
|
+
/**
|
|
19
|
+
* Custom claims merged onto an `iat` claim (and `exp` when
|
|
20
|
+
* `ttlSeconds` is supplied). Caller-provided keys override the
|
|
21
|
+
* standard ones.
|
|
22
|
+
*/
|
|
23
|
+
payload: Record<string, unknown>;
|
|
24
|
+
/**
|
|
25
|
+
* Lifetime of the token in seconds. When set, the JWT's `exp` claim
|
|
26
|
+
* is computed as `iat + ttlSeconds`. When omitted, no `exp` is added
|
|
27
|
+
* (the caller is responsible for one if needed).
|
|
28
|
+
*/
|
|
29
|
+
ttlSeconds?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Signs a JWT (RFC 7519) with `alg=ES256, typ=JWT` and returns the
|
|
33
|
+
* compact serialization. Always sets `iat` to the current second; the
|
|
34
|
+
* caller controls every other claim via `payload`.
|
|
35
|
+
*/
|
|
36
|
+
declare function signJwt(options: SignJwtOptions): Promise<string>;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { signJwt, verifyJwt };
|
|
39
|
+
//# sourceMappingURL=jwt-utils.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { base64url, base64urlDecode } from "../shared/encoding/base64.js";
|
|
2
|
+
//#region src/server/utils/jwt-utils.ts
|
|
3
|
+
/**
|
|
4
|
+
* Low-level helper that encodes a JWS Compact Serialization JWT
|
|
5
|
+
* (RFC 7519) and signs it with the supplied `privateKey` using
|
|
6
|
+
* ES256 (P-256 + SHA-256). Returns the three-segment compact form.
|
|
7
|
+
*/
|
|
8
|
+
async function encodeAndSignJwt(options) {
|
|
9
|
+
const { header, payload, privateKey } = options;
|
|
10
|
+
const signingInput = `${base64url(new TextEncoder().encode(JSON.stringify(header)))}.${base64url(new TextEncoder().encode(JSON.stringify(payload)))}`;
|
|
11
|
+
const signatureBuffer = await crypto.subtle.sign({
|
|
12
|
+
name: "ECDSA",
|
|
13
|
+
hash: "SHA-256"
|
|
14
|
+
}, privateKey, new TextEncoder().encode(signingInput));
|
|
15
|
+
return `${signingInput}.${base64url(new Uint8Array(signatureBuffer))}`;
|
|
16
|
+
}
|
|
17
|
+
async function importPublicKey(jwk) {
|
|
18
|
+
return crypto.subtle.importKey("jwk", jwk, {
|
|
19
|
+
name: "ECDSA",
|
|
20
|
+
namedCurve: "P-256"
|
|
21
|
+
}, false, ["verify"]);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Verifies the ES256 signature on `token` against `publicKeyJwk` and
|
|
25
|
+
* returns the decoded payload. Does not check `exp` — use
|
|
26
|
+
* {@link verifyJwt} when expiry enforcement is desired.
|
|
27
|
+
*
|
|
28
|
+
* @throws {Error} When the token isn't three segments, when the
|
|
29
|
+
* signature fails verification, or when the payload isn't valid
|
|
30
|
+
* JSON.
|
|
31
|
+
*/
|
|
32
|
+
async function decodeAndVerifyJwt(options) {
|
|
33
|
+
const { token, publicKeyJwk } = options;
|
|
34
|
+
const parts = token.split(".");
|
|
35
|
+
if (parts.length !== 3) throw new Error("Invalid JWT format");
|
|
36
|
+
const [encodedHeader, encodedPayload, encodedSignature] = parts;
|
|
37
|
+
const publicKey = await importPublicKey(publicKeyJwk);
|
|
38
|
+
if (!await crypto.subtle.verify({
|
|
39
|
+
name: "ECDSA",
|
|
40
|
+
hash: "SHA-256"
|
|
41
|
+
}, publicKey, base64urlDecode(encodedSignature), new TextEncoder().encode(`${encodedHeader}.${encodedPayload}`))) throw new Error("JWT signature verification failed");
|
|
42
|
+
return JSON.parse(new TextDecoder().decode(base64urlDecode(encodedPayload)));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Verifies signature and (if present) `exp` (RFC 7519 §4.1.4) on a
|
|
46
|
+
* JWT and returns its payload.
|
|
47
|
+
*
|
|
48
|
+
* @throws {Error} When the signature fails or when `exp` has passed.
|
|
49
|
+
*/
|
|
50
|
+
async function verifyJwt(options) {
|
|
51
|
+
const { token, publicKeyJwk } = options;
|
|
52
|
+
const payload = await decodeAndVerifyJwt({
|
|
53
|
+
token,
|
|
54
|
+
publicKeyJwk
|
|
55
|
+
});
|
|
56
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
57
|
+
if (typeof payload["exp"] === "number" && payload["exp"] < now) throw new Error("JWT expired");
|
|
58
|
+
return payload;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Signs a JWT (RFC 7519) with `alg=ES256, typ=JWT` and returns the
|
|
62
|
+
* compact serialization. Always sets `iat` to the current second; the
|
|
63
|
+
* caller controls every other claim via `payload`.
|
|
64
|
+
*/
|
|
65
|
+
async function signJwt(options) {
|
|
66
|
+
const { privateKey, payload, ttlSeconds } = options;
|
|
67
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
68
|
+
return encodeAndSignJwt({
|
|
69
|
+
header: {
|
|
70
|
+
alg: "ES256",
|
|
71
|
+
typ: "JWT"
|
|
72
|
+
},
|
|
73
|
+
payload: ttlSeconds !== void 0 ? {
|
|
74
|
+
iat: now,
|
|
75
|
+
exp: now + ttlSeconds,
|
|
76
|
+
...payload
|
|
77
|
+
} : {
|
|
78
|
+
iat: now,
|
|
79
|
+
...payload
|
|
80
|
+
},
|
|
81
|
+
privateKey
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { decodeAndVerifyJwt, encodeAndSignJwt, signJwt, verifyJwt };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=jwt-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-utils.js","names":[],"sources":["../../../src/server/utils/jwt-utils.ts"],"sourcesContent":["import { base64url, base64urlDecode } from './base64-utils.ts';\n\ninterface EncodeAndSignJwtOptions {\n header: Record<string, unknown>;\n payload: Record<string, unknown>;\n privateKey: CryptoKey;\n}\n\n/**\n * Low-level helper that encodes a JWS Compact Serialization JWT\n * (RFC 7519) and signs it with the supplied `privateKey` using\n * ES256 (P-256 + SHA-256). Returns the three-segment compact form.\n */\nexport async function encodeAndSignJwt(\n options: EncodeAndSignJwtOptions\n): Promise<string> {\n const { header, payload, privateKey } = options;\n\n const encodedHeader = base64url(\n new TextEncoder().encode(JSON.stringify(header))\n );\n const encodedPayload = base64url(\n new TextEncoder().encode(JSON.stringify(payload))\n );\n const signingInput = `${encodedHeader}.${encodedPayload}`;\n const signatureBuffer = await crypto.subtle.sign(\n { name: 'ECDSA', hash: 'SHA-256' },\n privateKey,\n new TextEncoder().encode(signingInput)\n );\n return `${signingInput}.${base64url(new Uint8Array(signatureBuffer))}`;\n}\n\nasync function importPublicKey(jwk: JsonWebKey): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'jwk',\n jwk,\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify']\n );\n}\n\ninterface DecodeAndVerifyJwtOptions {\n token: string;\n publicKeyJwk: JsonWebKey;\n}\n\n/**\n * Verifies the ES256 signature on `token` against `publicKeyJwk` and\n * returns the decoded payload. Does not check `exp` — use\n * {@link verifyJwt} when expiry enforcement is desired.\n *\n * @throws {Error} When the token isn't three segments, when the\n * signature fails verification, or when the payload isn't valid\n * JSON.\n */\nexport async function decodeAndVerifyJwt(\n options: DecodeAndVerifyJwtOptions\n): Promise<Record<string, unknown>> {\n const { token, publicKeyJwk } = options;\n const parts = token.split('.');\n if (parts.length !== 3) throw new Error('Invalid JWT format');\n const [encodedHeader, encodedPayload, encodedSignature] = parts as [\n string,\n string,\n string,\n ];\n const publicKey = await importPublicKey(publicKeyJwk);\n const valid = await crypto.subtle.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n publicKey,\n base64urlDecode(encodedSignature),\n new TextEncoder().encode(`${encodedHeader}.${encodedPayload}`)\n );\n if (!valid) throw new Error('JWT signature verification failed');\n return JSON.parse(\n new TextDecoder().decode(base64urlDecode(encodedPayload))\n ) as Record<string, unknown>;\n}\n\nexport interface VerifyJwtOptions {\n /** Compact-serialized JWT to verify. */\n token: string;\n /** Public key in JWK form. Caller is responsible for trusting it. */\n publicKeyJwk: JsonWebKey;\n}\n\n/**\n * Verifies signature and (if present) `exp` (RFC 7519 §4.1.4) on a\n * JWT and returns its payload.\n *\n * @throws {Error} When the signature fails or when `exp` has passed.\n */\nexport async function verifyJwt(\n options: VerifyJwtOptions\n): Promise<Record<string, unknown>> {\n const { token, publicKeyJwk } = options;\n const payload = await decodeAndVerifyJwt({ token, publicKeyJwk });\n const now = Math.floor(Date.now() / 1000);\n if (typeof payload['exp'] === 'number' && payload['exp'] < now) {\n throw new Error('JWT expired');\n }\n return payload;\n}\n\nexport interface SignJwtOptions {\n /** ES256 private key as a non-extractable WebCrypto key. */\n privateKey: CryptoKey;\n /**\n * Custom claims merged onto an `iat` claim (and `exp` when\n * `ttlSeconds` is supplied). Caller-provided keys override the\n * standard ones.\n */\n payload: Record<string, unknown>;\n /**\n * Lifetime of the token in seconds. When set, the JWT's `exp` claim\n * is computed as `iat + ttlSeconds`. When omitted, no `exp` is added\n * (the caller is responsible for one if needed).\n */\n ttlSeconds?: number;\n}\n\n/**\n * Signs a JWT (RFC 7519) with `alg=ES256, typ=JWT` and returns the\n * compact serialization. Always sets `iat` to the current second; the\n * caller controls every other claim via `payload`.\n */\nexport async function signJwt(options: SignJwtOptions): Promise<string> {\n const { privateKey, payload, ttlSeconds } = options;\n const now = Math.floor(Date.now() / 1000);\n const payloadWithStandardClaims =\n ttlSeconds !== undefined\n ? { iat: now, exp: now + ttlSeconds, ...payload }\n : { iat: now, ...payload };\n return encodeAndSignJwt({\n header: { alg: 'ES256', typ: 'JWT' },\n payload: payloadWithStandardClaims,\n privateKey,\n });\n}\n"],"mappings":";;;;;;;AAaA,eAAsB,iBACpB,SACiB;CACjB,MAAM,EAAE,QAAQ,SAAS,eAAe;CAQxC,MAAM,eAAe,GANC,UACpB,IAAI,aAAa,CAAC,OAAO,KAAK,UAAU,OAAO,CAAC,CAKb,CAAC,GAHf,UACrB,IAAI,aAAa,CAAC,OAAO,KAAK,UAAU,QAAQ,CAAC,CAEI;CACvD,MAAM,kBAAkB,MAAM,OAAO,OAAO,KAC1C;EAAE,MAAM;EAAS,MAAM;EAAW,EAClC,YACA,IAAI,aAAa,CAAC,OAAO,aAAa,CACvC;CACD,OAAO,GAAG,aAAa,GAAG,UAAU,IAAI,WAAW,gBAAgB,CAAC;;AAGtE,eAAe,gBAAgB,KAAqC;CAClE,OAAO,OAAO,OAAO,UACnB,OACA,KACA;EAAE,MAAM;EAAS,YAAY;EAAS,EACtC,OACA,CAAC,SAAS,CACX;;;;;;;;;;;AAiBH,eAAsB,mBACpB,SACkC;CAClC,MAAM,EAAE,OAAO,iBAAiB;CAChC,MAAM,QAAQ,MAAM,MAAM,IAAI;CAC9B,IAAI,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,qBAAqB;CAC7D,MAAM,CAAC,eAAe,gBAAgB,oBAAoB;CAK1D,MAAM,YAAY,MAAM,gBAAgB,aAAa;CAOrD,IAAI,CAAC,MANe,OAAO,OAAO,OAChC;EAAE,MAAM;EAAS,MAAM;EAAW,EAClC,WACA,gBAAgB,iBAAiB,EACjC,IAAI,aAAa,CAAC,OAAO,GAAG,cAAc,GAAG,iBAAiB,CAC/D,EACW,MAAM,IAAI,MAAM,oCAAoC;CAChE,OAAO,KAAK,MACV,IAAI,aAAa,CAAC,OAAO,gBAAgB,eAAe,CAAC,CAC1D;;;;;;;;AAgBH,eAAsB,UACpB,SACkC;CAClC,MAAM,EAAE,OAAO,iBAAiB;CAChC,MAAM,UAAU,MAAM,mBAAmB;EAAE;EAAO;EAAc,CAAC;CACjE,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CACzC,IAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,SAAS,KACzD,MAAM,IAAI,MAAM,cAAc;CAEhC,OAAO;;;;;;;AAyBT,eAAsB,QAAQ,SAA0C;CACtE,MAAM,EAAE,YAAY,SAAS,eAAe;CAC5C,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;CAKzC,OAAO,iBAAiB;EACtB,QAAQ;GAAE,KAAK;GAAS,KAAK;GAAO;EACpC,SALA,eAAe,KAAA,IACX;GAAE,KAAK;GAAK,KAAK,MAAM;GAAY,GAAG;GAAS,GAC/C;GAAE,KAAK;GAAK,GAAG;GAAS;EAI5B;EACD,CAAC"}
|
package/eslint.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hubspot/app-connect-sdk",
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
|
+
"description": "HubSpot App Connect SDK (alpha release). Documentation and integration guidance forthcoming.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
"./browser": "./dist/browser/index.js",
|
|
8
|
+
"./react": "./dist/browser/react.js",
|
|
9
|
+
"./react/lovable": "./dist/browser/react/lovable.js",
|
|
10
|
+
"./server/api-client": "./dist/server/api-client-core.js",
|
|
11
|
+
"./server/lovable": "./dist/server/lovable.js",
|
|
12
|
+
"./server/oauth": "./dist/server/oauth.js"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public",
|
|
16
|
+
"registry": "https://registry.npmjs.org",
|
|
17
|
+
"tag": "v1-alpha",
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md",
|
|
21
|
+
"src"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"prettier": "@private/prettier-config",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"hono": "^4.0.0",
|
|
27
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependenciesMeta": {
|
|
30
|
+
"hono": {
|
|
31
|
+
"optional": true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@base-ui/react": "^1.4.1"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=24.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/deno": "^2.5.0",
|
|
42
|
+
"@types/node": "25.6.0",
|
|
43
|
+
"@types/react": "^19.1.0",
|
|
44
|
+
"@vanilla-extract/css": "^1.20.1",
|
|
45
|
+
"@vanilla-extract/rollup-plugin": "^1.5.3",
|
|
46
|
+
"eslint": "10.0.3",
|
|
47
|
+
"hono": "^4.7.11",
|
|
48
|
+
"prettier": "3.8.1",
|
|
49
|
+
"react": "^19.1.0",
|
|
50
|
+
"tsdown": "0.22.0-beta.3",
|
|
51
|
+
"typescript": "6.0.3",
|
|
52
|
+
"vitest": "4.0.18",
|
|
53
|
+
"@private/eslint-config": "0.1.0",
|
|
54
|
+
"@private/tsconfig": "0.1.0",
|
|
55
|
+
"@private/prettier-config": "0.1.0"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"clean": "rm -rf dist build *.tsbuildinfo node_modules .turbo",
|
|
59
|
+
"dev": "tsdown --watch",
|
|
60
|
+
"format": "prettier --write . --ignore-path ../../.prettierignore",
|
|
61
|
+
"format:check": "prettier --check . --ignore-path ../../.prettierignore",
|
|
62
|
+
"lint": "eslint .",
|
|
63
|
+
"test": "vitest run",
|
|
64
|
+
"test:watch": "vitest",
|
|
65
|
+
"tsdown": "tsdown",
|
|
66
|
+
"tsc": "tsc --build"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# `app-connect-controller` (internal)
|
|
2
|
+
|
|
3
|
+
This folder owns the browser-side OAuth lifecycle for the SDK: starting a connect flow, picking up the OAuth callback, refreshing the access token in the background, and disconnecting. It is **internal** — only `createAppConnectController` (and its `CreateAppConnectControllerOptions` type) leak out via [../index.ts](../index.ts). Everything else in this folder is implementation detail and may change without notice.
|
|
4
|
+
|
|
5
|
+
For consumer-facing usage (browser bootstrap, `<HubSpotAppConnect>`, server route shapes) see the package [README](../../../README.md). This document is for SDK maintainers reading the source for the first time.
|
|
6
|
+
|
|
7
|
+
## Public surface
|
|
8
|
+
|
|
9
|
+
- [`createAppConnectController`](./create.ts) — factory that returns an `AppConnectController`.
|
|
10
|
+
- The returned `AppConnectController` shape (`subscribe` / `getSnapshot` / `getServerSnapshot` / `start`) lives in [../types.ts](../types.ts) so it plugs directly into React's `useSyncExternalStore`.
|
|
11
|
+
|
|
12
|
+
The controller is inert until `start()` is called. Calling `createAppConnectController` does not read session storage, schedule a refresh timer, or issue any fetches.
|
|
13
|
+
|
|
14
|
+
## Architecture overview
|
|
15
|
+
|
|
16
|
+
The controller is composed from three small, generic building blocks under [`utils/`](./utils):
|
|
17
|
+
|
|
18
|
+
- [`Store<TState>`](./utils/store-utils.ts) — a tiny external store with shallow-equal change detection. Listeners only fire when at least one field actually changed.
|
|
19
|
+
- [`SessionStorage`](./types.ts) adapter (default impl in [`default-session-storage.ts`](./default-session-storage.ts)) — narrow interface so tests can plug in an in-memory implementation without a DOM.
|
|
20
|
+
- [`memoizeLast`](./utils/memoize-utils.ts) — single-slot memoization that keeps `getSnapshot()` referentially stable for React.
|
|
21
|
+
|
|
22
|
+
These dependencies are bundled into an `AppConnectContext` ([types.ts](./types.ts)) — `{ config, logger, sessionStorage, store }` — which is the single argument every per-flow helper accepts. That keeps call sites flat and avoids drift between functions on positional argument order.
|
|
23
|
+
|
|
24
|
+
The view-state derivation in [view-state.ts](./view-state.ts) reduces the boolean lifecycle flags in `AppConnectInternalState` into the public `AppConnectStatus` enum. The order of checks (disconnect-in-flight beats connect-in-flight, etc.) is documented inline next to `getDerivedStatus`.
|
|
25
|
+
|
|
26
|
+
## Lifecycle
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
flowchart TD
|
|
30
|
+
factory["createAppConnectController(options)"] --> inert["inert controller"]
|
|
31
|
+
inert -->|"start()"| started["controller started"]
|
|
32
|
+
started --> sched["startRefreshScheduler(context)"]
|
|
33
|
+
started --> initFlow["initAppConnect(context)"]
|
|
34
|
+
initFlow -->|"reads ?__hs_expires_at"| store[("Store<AppConnectInternalState>")]
|
|
35
|
+
|
|
36
|
+
subgraph flows [Per-flow helpers]
|
|
37
|
+
connect["startHubSpotConnection (connect-start.ts)"]
|
|
38
|
+
disconnect["disconnectFromHubSpot (disconnect.ts)"]
|
|
39
|
+
refresh["refreshAccessToken (refresh.ts)"]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
connect -->|"setState"| store
|
|
43
|
+
disconnect -->|"setState"| store
|
|
44
|
+
refresh -->|"setState"| store
|
|
45
|
+
sched -->|"on store change"| refresh
|
|
46
|
+
|
|
47
|
+
store -->|"subscribe"| react["React useSyncExternalStore"]
|
|
48
|
+
store -->|"getSnapshot + memoizeLast"| view["AppConnectState (view-state.ts)"]
|
|
49
|
+
view --> react
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
1. `createAppConnectController` builds the `Store`, the default `SessionStorage`, and the `AppConnectContext`, then hydrates `expiresAt` from session storage if present.
|
|
53
|
+
2. `controller.start()` is idempotent. On the first call it starts the refresh scheduler and runs `initAppConnect` to consume the `?__hs_expires_at=…` parameter the OAuth callback adds to the redirect URL.
|
|
54
|
+
3. `connectToHubSpot()` and `disconnectFromHubSpot()` are exposed on the public `AppConnectState`. Both wrap their respective flow helpers and funnel errors into `state.error`.
|
|
55
|
+
4. The refresh scheduler is store-driven: it re-evaluates whenever the store changes and (re)schedules a single `setTimeout` against `expiresAt - REFRESH_BUFFER_MS`.
|
|
56
|
+
|
|
57
|
+
## Module map
|
|
58
|
+
|
|
59
|
+
- [create.ts](./create.ts) — factory; the only file [`../index.ts`](../index.ts) imports from. Wires the context, defines `connectToHubSpot` / `disconnectFromHubSpot`, and applies `memoizeLast` to `getSnapshot`.
|
|
60
|
+
- [init.ts](./init.ts) — runs once on `start()`. Reads `?__hs_expires_at=…` from `window.location`, persists it via [`utils/session-utils.ts`](./utils/session-utils.ts), and scrubs the parameter from the address bar with `history.replaceState`.
|
|
61
|
+
- [connect-start.ts](./connect-start.ts) — `GET`s the SDK's `/auth/init-session` route, then full-page redirects to HubSpot's `authorize` URL. The `return_path` is the current path + query so the user lands back where they started.
|
|
62
|
+
- [disconnect.ts](./disconnect.ts) — `POST`s `/auth/logout`, clears local session storage, and redirects to the server-supplied `redirect_to`. Errors are caught and surfaced via `state.error`.
|
|
63
|
+
- [refresh.ts](./refresh.ts) — subscribes to the store and (re)schedules a `/auth/refresh` call whenever `expiresAt` changes. Exposes `RefreshSchedulerHandle.stop()` for teardown.
|
|
64
|
+
- [view-state.ts](./view-state.ts) — `getDerivedStatus` and `SERVER_VIEW` (the SSR snapshot returned by `getServerSnapshot`).
|
|
65
|
+
- [default-session-storage.ts](./default-session-storage.ts) — adapter around the global `sessionStorage`.
|
|
66
|
+
- [constants.ts](./constants.ts) — `EXPIRES_AT_KEY`, `REFRESH_BUFFER_MS`; re-exports the shared `EXPIRES_AT_URL_PARAM`.
|
|
67
|
+
- [types.ts](./types.ts) — internal types: `AppConnectInternalState`, `AppConnectContext`, `AppConnectStore`, `SessionStorage`.
|
|
68
|
+
- [utils/session-utils.ts](./utils/session-utils.ts) — read/write `expiresAt` to session storage, `isClientSessionActive`, `clearSessionStorage`.
|
|
69
|
+
- [utils/store-utils.ts](./utils/store-utils.ts) — the generic `Store<TState>`.
|
|
70
|
+
- [utils/memoize-utils.ts](./utils/memoize-utils.ts) — single-slot memoization for view state.
|
|
71
|
+
- [utils/timeout-utils.ts](./utils/timeout-utils.ts) — `delay` helper used by `connect-start.ts`.
|
|
72
|
+
- [utils/crypto-utils.ts](./utils/crypto-utils.ts) / [utils/encode-utils.ts](./utils/encode-utils.ts) — thin re-exports of `shared/encoding/*` shared with the server.
|
|
73
|
+
- [view-state.test.ts](./view-state.test.ts), [utils/\*.test.ts](./utils) — Vitest specs.
|
|
74
|
+
|
|
75
|
+
## Internal state model
|
|
76
|
+
|
|
77
|
+
`AppConnectInternalState` ([types.ts](./types.ts)) is the single source of truth. Each field is flipped by exactly the flows that own it:
|
|
78
|
+
|
|
79
|
+
- `isInitComplete` — set to `true` in the `finally` block of the async init step in `create.ts`. Stays `true` for the lifetime of the controller.
|
|
80
|
+
- `isConnectInFlight` — toggled by the `connectToHubSpot` wrapper in `create.ts` around `startHubSpotConnection`. Cleared in `finally` even though the page is usually about to unload.
|
|
81
|
+
- `isSessionConnected` — set after init completes (mirrors `isClientSessionActive`) and cleared by `disconnectFromHubSpot` and by refresh failures in `refresh.ts`.
|
|
82
|
+
- `isDisconnectInFlight` — toggled by `disconnectFromHubSpot` in `disconnect.ts`.
|
|
83
|
+
- `error` — most recent error from any flow. Intentionally last-write-wins so the UI shows the most actionable failure; flows clear it at their start (`error: null`).
|
|
84
|
+
- `expiresAt` — the access-token expiry in Unix epoch milliseconds, or `null`. Persisted to session storage so it survives full-page navigations within the tab. Always go through [`utils/session-utils.ts`](./utils/session-utils.ts) — do not read or write this field directly elsewhere.
|
|
85
|
+
|
|
86
|
+
## Maintainer notes
|
|
87
|
+
|
|
88
|
+
- Every flow helper takes a single `AppConnectContext` argument, matching the repo's "single options object" rule from [AGENTS.md](../../../../../AGENTS.md). When a new flow needs another dependency, add it to `AppConnectContext` rather than threading new positional arguments through.
|
|
89
|
+
- The `Store` is the only place mutable state lives. Anything that should be observable to React must flow through `store.setState`; otherwise `getSnapshot()` will skip the change because `memoizeLast` keys on the store snapshot reference.
|
|
90
|
+
- Keep `getDerivedStatus` allocation-free. Allocating inside it (e.g. building a new object literal that's then returned alongside actions) defeats the `memoizeLast` cache and triggers re-renders on every unrelated store update.
|
|
91
|
+
- `getServerSnapshot()` returns the frozen module-level `SERVER_VIEW` constant. Keep it referentially stable for SSR — React reuses it across renders.
|
|
92
|
+
- Adding a new flow: define the helper in its own file under this folder, accept `AppConnectContext`, mutate state only via `store.setState`, and expose it on the public `AppConnectState` from `create.ts` if the UI needs to call it.
|