@hubspot/app-connect-sdk 1.0.0-alpha.2 → 1.0.0-alpha.4
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-tsdown.log +41 -510
- package/build/tsconfig.browser.tsbuildinfo +1 -1
- package/build/tsconfig.server.tsbuildinfo +1 -1
- package/dist/browser/{HubSpotAppConnect-BW45gyDs.js → HubSpotAppConnect-COQgPrFn.js} +5 -3
- package/dist/browser/HubSpotAppConnect-COQgPrFn.js.map +1 -0
- package/dist/browser/{create-vctOhpX9.js → create-hzqjIhmO.js} +54 -25
- package/dist/browser/create-hzqjIhmO.js.map +1 -0
- package/dist/browser/index.js +1 -1
- package/dist/browser/react/lovable.js +2 -2
- package/dist/browser/react.js +1 -1
- package/dist/server/api-client.d.ts +60625 -197
- package/dist/server/api-client.js +5826 -100
- package/dist/server/api-client.js.map +1 -0
- package/dist/server/{api-client-core/client.js → binary-data-BOalJzKu.js} +58 -3
- package/dist/server/binary-data-BOalJzKu.js.map +1 -0
- package/dist/server/lovable.d.ts +117 -6
- package/dist/server/lovable.js +1458 -3
- package/dist/server/lovable.js.map +1 -0
- package/dist/server/oauth.d.ts +128 -6
- package/dist/server/oauth.js +1 -4
- package/dist/server/sha256-B7y8GBFB.js +228 -0
- package/dist/server/sha256-B7y8GBFB.js.map +1 -0
- package/dist/server/{types.d.ts → types-5gfN91Fq.d.ts} +2 -2
- package/dist/server/{api-client-core/types.d.ts → types-DEOUH4wE.d.ts} +2 -2
- package/package.json +4 -10
- package/src/browser/app-connect-controller/connect-start.ts +2 -1
- package/src/browser/app-connect-controller/init.test.ts +167 -0
- package/src/browser/app-connect-controller/init.ts +70 -19
- package/src/browser/react/components/AppConnectHeader/AppConnectHeader.tsx +3 -5
- package/src/browser/react/components/ConnectButton/ConnectButton.tsx +2 -1
- package/src/server/api-client-core/plugins/fetch-transport.ts +5 -1
- package/src/server/constants.ts +29 -4
- package/src/server/hono/hono-request-handler.ts +42 -15
- package/src/server/hono/hubspot-connect-routes/auth-complete.test.ts +285 -0
- package/src/server/hono/hubspot-connect-routes/{auth-callback.ts → auth-complete.ts} +73 -30
- package/src/server/hono/hubspot-connect-routes/auth-init-session.test.ts +114 -30
- package/src/server/hono/hubspot-connect-routes/auth-init-session.ts +33 -10
- package/src/server/hono/hubspot-connect-routes/auth-logout.test.ts +13 -0
- package/src/server/hono/hubspot-connect-routes/auth-logout.ts +18 -0
- package/src/server/hono/hubspot-connect-routes/auth-refresh.test.ts +6 -0
- package/src/server/hono/hubspot-connect-routes/auth-refresh.ts +6 -0
- package/src/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts +9 -2
- package/src/server/hono/hubspot-connect-routes/utils.ts +57 -1
- package/src/server/hono/types.ts +15 -9
- package/src/server/hono/utils/cookie-utils.ts +27 -2
- package/src/server/hono/utils/cors-middleware.test.ts +79 -0
- package/src/server/hono/utils/cors-middleware.ts +95 -0
- package/src/server/sanitize-request.ts +25 -11
- package/src/server/types.ts +2 -2
- package/src/shared/constants.ts +31 -3
- package/src/shared/wire-types.ts +19 -0
- package/tsdown.config.ts +1 -1
- package/.turbo/turbo-format$colon$check.log +0 -4
- package/.turbo/turbo-lint.log +0 -2
- package/.turbo/turbo-test.log +0 -76
- package/dist/browser/HubSpotAppConnect-BW45gyDs.js.map +0 -1
- package/dist/browser/create-vctOhpX9.js.map +0 -1
- package/dist/server/api-client-core/apis/account/account-info-types.generated.d.ts +0 -111
- package/dist/server/api-client-core/apis/account/account-info.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/account/account-info.generated.js +0 -9
- package/dist/server/api-client-core/apis/account/account-info.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/account/audit-logs-types.generated.d.ts +0 -247
- package/dist/server/api-client-core/apis/account/audit-logs.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/account/audit-logs.generated.js +0 -28
- package/dist/server/api-client-core/apis/account/audit-logs.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/auth/oauth-types.generated.d.ts +0 -121
- package/dist/server/api-client-core/apis/auth/oauth.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/auth/oauth.generated.js +0 -19
- package/dist/server/api-client-core/apis/auth/oauth.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/automation/actions-types.generated.d.ts +0 -933
- package/dist/server/api-client-core/apis/automation/actions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/automation/actions.generated.js +0 -121
- package/dist/server/api-client-core/apis/automation/actions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/automation/sequences-types.generated.d.ts +0 -422
- package/dist/server/api-client-core/apis/automation/sequences.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/automation/sequences.generated.js +0 -22
- package/dist/server/api-client-core/apis/automation/sequences.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/business-units-types.generated.d.ts +0 -75
- package/dist/server/api-client-core/apis/business-units.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/business-units.generated.js +0 -12
- package/dist/server/api-client-core/apis/business-units.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/authors-types.generated.d.ts +0 -551
- package/dist/server/api-client-core/apis/cms/authors.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/authors.generated.js +0 -163
- package/dist/server/api-client-core/apis/cms/authors.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/blog-settings-types.generated.d.ts +0 -366
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.js +0 -43
- package/dist/server/api-client-core/apis/cms/blog-settings.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/cms-content-audit-types.generated.d.ts +0 -157
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js +0 -18
- package/dist/server/api-client-core/apis/cms/cms-content-audit.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/domains-types.generated.d.ts +0 -193
- package/dist/server/api-client-core/apis/cms/domains.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/domains.generated.js +0 -20
- package/dist/server/api-client-core/apis/cms/domains.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/hubdb-types.generated.d.ts +0 -1097
- package/dist/server/api-client-core/apis/cms/hubdb.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/hubdb.generated.js +0 -192
- package/dist/server/api-client-core/apis/cms/hubdb.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/media-bridge-types.generated.d.ts +0 -1780
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.js +0 -185
- package/dist/server/api-client-core/apis/cms/media-bridge.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/pages-types.generated.d.ts +0 -1768
- package/dist/server/api-client-core/apis/cms/pages.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/pages.generated.js +0 -331
- package/dist/server/api-client-core/apis/cms/pages.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/posts-types.generated.d.ts +0 -1090
- package/dist/server/api-client-core/apis/cms/posts.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/posts.generated.js +0 -201
- package/dist/server/api-client-core/apis/cms/posts.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/site-search-types.generated.d.ts +0 -200
- package/dist/server/api-client-core/apis/cms/site-search.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/site-search.generated.js +0 -32
- package/dist/server/api-client-core/apis/cms/site-search.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/source-code-types.generated.d.ts +0 -218
- package/dist/server/api-client-core/apis/cms/source-code.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/source-code.generated.js +0 -52
- package/dist/server/api-client-core/apis/cms/source-code.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/tags-types.generated.d.ts +0 -515
- package/dist/server/api-client-core/apis/cms/tags.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/tags.generated.js +0 -163
- package/dist/server/api-client-core/apis/cms/tags.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/url-mappings-types.generated.d.ts +0 -177
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.js +0 -14
- package/dist/server/api-client-core/apis/cms/url-mappings.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/cms/url-redirects-types.generated.d.ts +0 -226
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.js +0 -26
- package/dist/server/api-client-core/apis/cms/url-redirects.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.d.ts +0 -802
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js +0 -74
- package/dist/server/api-client-core/apis/communication-preferences/subscriptions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/conversations/custom-channels-types.generated.d.ts +0 -551
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js +0 -80
- package/dist/server/api-client-core/apis/conversations/custom-channels.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/conversations/visitor-identification-types.generated.d.ts +0 -60
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js +0 -6
- package/dist/server/api-client-core/apis/conversations/visitor-identification.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/conversations-types.generated.d.ts +0 -908
- package/dist/server/api-client-core/apis/conversations.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/conversations.generated.js +0 -108
- package/dist/server/api-client-core/apis/conversations.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/app-uninstalls-types.generated.d.ts +0 -37
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js +0 -6
- package/dist/server/api-client-core/apis/crm/app-uninstalls.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/appointments-types.generated.d.ts +0 -989
- package/dist/server/api-client-core/apis/crm/appointments.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/appointments.generated.js +0 -118
- package/dist/server/api-client-core/apis/crm/appointments.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/associations-schema-types.generated.d.ts +0 -329
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.js +0 -60
- package/dist/server/api-client-core/apis/crm/associations-schema.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/associations-types.generated.d.ts +0 -661
- package/dist/server/api-client-core/apis/crm/associations.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/associations.generated.js +0 -83
- package/dist/server/api-client-core/apis/crm/associations.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/calling-extensions-types.generated.d.ts +0 -466
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js +0 -42
- package/dist/server/api-client-core/apis/crm/calling-extensions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/calls-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/calls.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/calls.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/calls.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/carts-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/carts.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/carts.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/carts.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/commerce-payments-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/commerce-payments.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.d.ts +0 -847
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/commerce-subscriptions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/communications-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/communications.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/communications.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/communications.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/companies-types.generated.d.ts +0 -884
- package/dist/server/api-client-core/apis/crm/companies.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/companies.generated.js +0 -67
- package/dist/server/api-client-core/apis/crm/companies.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/contacts-types.generated.d.ts +0 -899
- package/dist/server/api-client-core/apis/crm/contacts.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/contacts.generated.js +0 -70
- package/dist/server/api-client-core/apis/crm/contacts.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/contracts-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/contracts.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/contracts.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/contracts.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/courses-types.generated.d.ts +0 -853
- package/dist/server/api-client-core/apis/crm/courses.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/courses.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/courses.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/crm-owners-types.generated.d.ts +0 -140
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.js +0 -20
- package/dist/server/api-client-core/apis/crm/crm-owners.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/custom-objects-types.generated.d.ts +0 -934
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.js +0 -101
- package/dist/server/api-client-core/apis/crm/custom-objects.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/deal-splits-types.generated.d.ts +0 -196
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.js +0 -9
- package/dist/server/api-client-core/apis/crm/deal-splits.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/deals-types.generated.d.ts +0 -872
- package/dist/server/api-client-core/apis/crm/deals.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/deals.generated.js +0 -67
- package/dist/server/api-client-core/apis/crm/deals.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/discounts-types.generated.d.ts +0 -846
- package/dist/server/api-client-core/apis/crm/discounts.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/discounts.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/discounts.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/emails-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/emails.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/emails.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/emails.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/exports-types.generated.d.ts +0 -281
- package/dist/server/api-client-core/apis/crm/exports.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/exports.generated.js +0 -12
- package/dist/server/api-client-core/apis/crm/exports.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/feedback-submissions-types.generated.d.ts +0 -616
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js +0 -55
- package/dist/server/api-client-core/apis/crm/feedback-submissions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/fees-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/fees.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/fees.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/fees.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/goal-targets-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/goal-targets.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/imports-types.generated.d.ts +0 -371
- package/dist/server/api-client-core/apis/crm/imports.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/imports.generated.js +0 -30
- package/dist/server/api-client-core/apis/crm/imports.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/invoices-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/invoices.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/invoices.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/invoices.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/leads-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/leads.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/leads.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/leads.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/limits-tracking-types.generated.d.ts +0 -331
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js +0 -22
- package/dist/server/api-client-core/apis/crm/limits-tracking.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/line-items-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/line-items.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/line-items.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/line-items.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/listings-types.generated.d.ts +0 -853
- package/dist/server/api-client-core/apis/crm/listings.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/listings.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/listings.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/lists-types.generated.d.ts +0 -2265
- package/dist/server/api-client-core/apis/crm/lists.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/lists.generated.js +0 -105
- package/dist/server/api-client-core/apis/crm/lists.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/meetings-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/meetings.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/meetings.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/meetings.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/notes-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/notes.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/notes.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/notes.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/object-library-types.generated.d.ts +0 -60
- package/dist/server/api-client-core/apis/crm/object-library.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/object-library.generated.js +0 -9
- package/dist/server/api-client-core/apis/crm/object-library.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/objects-types.generated.d.ts +0 -712
- package/dist/server/api-client-core/apis/crm/objects.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/objects.generated.js +0 -76
- package/dist/server/api-client-core/apis/crm/objects.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/orders-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/orders.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/orders.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/orders.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/partner-clients-types.generated.d.ts +0 -725
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.js +0 -71
- package/dist/server/api-client-core/apis/crm/partner-clients.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/partner-services-types.generated.d.ts +0 -725
- package/dist/server/api-client-core/apis/crm/partner-services.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/partner-services.generated.js +0 -71
- package/dist/server/api-client-core/apis/crm/partner-services.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/pipelines-types.generated.d.ts +0 -430
- package/dist/server/api-client-core/apis/crm/pipelines.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/pipelines.generated.js +0 -94
- package/dist/server/api-client-core/apis/crm/pipelines.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/postal-mail-types.generated.d.ts +0 -844
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/postal-mail.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/products-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/products.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/products.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/products.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/projects-types.generated.d.ts +0 -881
- package/dist/server/api-client-core/apis/crm/projects.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/projects.generated.js +0 -67
- package/dist/server/api-client-core/apis/crm/projects.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/properties-types.generated.d.ts +0 -603
- package/dist/server/api-client-core/apis/crm/properties.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/properties.generated.js +0 -86
- package/dist/server/api-client-core/apis/crm/properties.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/property-validations-types.generated.d.ts +0 -121
- package/dist/server/api-client-core/apis/crm/property-validations.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/property-validations.generated.js +0 -25
- package/dist/server/api-client-core/apis/crm/property-validations.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.d.ts +0 -486
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js +0 -34
- package/dist/server/api-client-core/apis/crm/public-app-crm-cards.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.d.ts +0 -247
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js +0 -69
- package/dist/server/api-client-core/apis/crm/public-app-feature-flags.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/quotes-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/quotes.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/quotes.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/quotes.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/schemas-types.generated.d.ts +0 -669
- package/dist/server/api-client-core/apis/crm/schemas.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/schemas.generated.js +0 -41
- package/dist/server/api-client-core/apis/crm/schemas.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/services-types.generated.d.ts +0 -853
- package/dist/server/api-client-core/apis/crm/services.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/services.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/services.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/tasks-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/tasks.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/tasks.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/tasks.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/taxes-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/taxes.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/taxes.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/taxes.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/tickets-types.generated.d.ts +0 -884
- package/dist/server/api-client-core/apis/crm/tickets.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/tickets.generated.js +0 -67
- package/dist/server/api-client-core/apis/crm/tickets.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/timeline-types.generated.d.ts +0 -187
- package/dist/server/api-client-core/apis/crm/timeline.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/timeline.generated.js +0 -12
- package/dist/server/api-client-core/apis/crm/timeline.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/transcriptions-types.generated.d.ts +0 -152
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.js +0 -15
- package/dist/server/api-client-core/apis/crm/transcriptions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/users-types.generated.d.ts +0 -850
- package/dist/server/api-client-core/apis/crm/users.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/users.generated.js +0 -66
- package/dist/server/api-client-core/apis/crm/users.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.d.ts +0 -72
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js +0 -13
- package/dist/server/api-client-core/apis/crm/video-conferencing-extension.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/events/manage-event-definitions-types.generated.d.ts +0 -1005
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js +0 -39
- package/dist/server/api-client-core/apis/events/manage-event-definitions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/events/send-event-completions-types.generated.d.ts +0 -94
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.js +0 -9
- package/dist/server/api-client-core/apis/events/send-event-completions.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/events-types.generated.d.ts +0 -137
- package/dist/server/api-client-core/apis/events.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/events.generated.js +0 -23
- package/dist/server/api-client-core/apis/events.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/files-types.generated.d.ts +0 -791
- package/dist/server/api-client-core/apis/files.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/files.generated.js +0 -119
- package/dist/server/api-client-core/apis/files.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.d.ts +0 -989
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js +0 -139
- package/dist/server/api-client-core/apis/marketing/campaigns-public-api.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/marketing/marketing-emails-types.generated.d.ts +0 -883
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js +0 -108
- package/dist/server/api-client-core/apis/marketing/marketing-emails.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/marketing/marketing-events-types.generated.d.ts +0 -1788
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js +0 -176
- package/dist/server/api-client-core/apis/marketing/marketing-events.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/marketing/single-send-types.generated.d.ts +0 -123
- package/dist/server/api-client-core/apis/marketing/single-send.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/marketing/single-send.generated.js +0 -6
- package/dist/server/api-client-core/apis/marketing/single-send.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/marketing/transactional-single-send-types.generated.d.ts +0 -257
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js +0 -20
- package/dist/server/api-client-core/apis/marketing/transactional-single-send.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/meta/origins-types.generated.d.ts +0 -77
- package/dist/server/api-client-core/apis/meta/origins.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/meta/origins.generated.js +0 -15
- package/dist/server/api-client-core/apis/meta/origins.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/scheduler/meetings-types.generated.d.ts +0 -913
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.js +0 -34
- package/dist/server/api-client-core/apis/scheduler/meetings.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/settings/multicurrency-types.generated.d.ts +0 -404
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.js +0 -38
- package/dist/server/api-client-core/apis/settings/multicurrency.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/settings/tax-rates-types.generated.d.ts +0 -111
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.js +0 -13
- package/dist/server/api-client-core/apis/settings/tax-rates.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/settings/user-provisioning-types.generated.d.ts +0 -297
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js +0 -31
- package/dist/server/api-client-core/apis/settings/user-provisioning.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/webhooks-journal-types.generated.d.ts +0 -643
- package/dist/server/api-client-core/apis/webhooks-journal.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/webhooks-journal.generated.js +0 -75
- package/dist/server/api-client-core/apis/webhooks-journal.generated.js.map +0 -1
- package/dist/server/api-client-core/apis/webhooks-types.generated.d.ts +0 -1016
- package/dist/server/api-client-core/apis/webhooks.generated.d.ts +0 -7
- package/dist/server/api-client-core/apis/webhooks.generated.js +0 -105
- package/dist/server/api-client-core/apis/webhooks.generated.js.map +0 -1
- package/dist/server/api-client-core/binary-data.d.ts +0 -33
- package/dist/server/api-client-core/binary-data.js +0 -29
- package/dist/server/api-client-core/binary-data.js.map +0 -1
- package/dist/server/api-client-core/client.d.ts +0 -14
- package/dist/server/api-client-core/client.js.map +0 -1
- package/dist/server/api-client-core/codegen-helpers/file-op-wrappers.js +0 -25
- package/dist/server/api-client-core/codegen-helpers/file-op-wrappers.js.map +0 -1
- package/dist/server/api-client-core/errors.d.ts +0 -27
- package/dist/server/api-client-core/errors.js +0 -33
- package/dist/server/api-client-core/errors.js.map +0 -1
- package/dist/server/api-client-core/op.d.ts +0 -37
- package/dist/server/api-client-core/op.js +0 -44
- package/dist/server/api-client-core/op.js.map +0 -1
- package/dist/server/api-client-core/pagination.d.ts +0 -60
- package/dist/server/api-client-core/pagination.js +0 -103
- package/dist/server/api-client-core/pagination.js.map +0 -1
- package/dist/server/api-client-core/plugins/fetch-transport.js +0 -72
- package/dist/server/api-client-core/plugins/fetch-transport.js.map +0 -1
- package/dist/server/constants.js +0 -46
- package/dist/server/constants.js.map +0 -1
- package/dist/server/deno/start.d.ts +0 -12
- package/dist/server/deno/start.js +0 -21
- package/dist/server/deno/start.js.map +0 -1
- package/dist/server/hono/hono-request-handler.js +0 -54
- package/dist/server/hono/hono-request-handler.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/auth-callback.js +0 -125
- package/dist/server/hono/hubspot-connect-routes/auth-callback.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/auth-init-session.js +0 -90
- package/dist/server/hono/hubspot-connect-routes/auth-init-session.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/auth-logout.js +0 -97
- package/dist/server/hono/hubspot-connect-routes/auth-logout.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/auth-refresh.js +0 -101
- package/dist/server/hono/hubspot-connect-routes/auth-refresh.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.d.ts +0 -16
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.js +0 -13
- package/dist/server/hono/hubspot-connect-routes/cimd-client-metadata-types.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js +0 -42
- package/dist/server/hono/hubspot-connect-routes/cimd-public-routes.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/constants.js +0 -8
- package/dist/server/hono/hubspot-connect-routes/constants.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.js +0 -43
- package/dist/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js +0 -35
- package/dist/server/hono/hubspot-connect-routes/hubspot-connect-routes.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js +0 -34
- package/dist/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/oauth-client.js +0 -104
- package/dist/server/hono/hubspot-connect-routes/oauth-client.js.map +0 -1
- package/dist/server/hono/hubspot-connect-routes/utils.js +0 -73
- package/dist/server/hono/hubspot-connect-routes/utils.js.map +0 -1
- package/dist/server/hono/index.js +0 -4
- package/dist/server/hono/types.d.ts +0 -28
- package/dist/server/hono/utils/cookie-utils.js +0 -29
- package/dist/server/hono/utils/cookie-utils.js.map +0 -1
- package/dist/server/import-app-keys.js +0 -42
- package/dist/server/import-app-keys.js.map +0 -1
- package/dist/server/lovable/create-app-function-start.d.ts +0 -26
- package/dist/server/lovable/create-app-function-start.js +0 -28
- package/dist/server/lovable/create-app-function-start.js.map +0 -1
- package/dist/server/lovable/hubspot-connect/index.d.ts +0 -15
- package/dist/server/lovable/hubspot-connect/index.js +0 -20
- package/dist/server/lovable/hubspot-connect/index.js.map +0 -1
- package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js +0 -29
- package/dist/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.js.map +0 -1
- package/dist/server/proxy.js +0 -68
- package/dist/server/proxy.js.map +0 -1
- package/dist/server/sanitize-request.js +0 -41
- package/dist/server/sanitize-request.js.map +0 -1
- package/dist/server/secure-start-core.d.ts +0 -23
- package/dist/server/secure-start-core.js +0 -28
- package/dist/server/secure-start-core.js.map +0 -1
- package/dist/server/shared/constants.js +0 -17
- package/dist/server/shared/constants.js.map +0 -1
- package/dist/server/shared/encoding/base64.js +0 -45
- package/dist/server/shared/encoding/base64.js.map +0 -1
- package/dist/server/shared/encoding/sha256.d.ts +0 -10
- package/dist/server/shared/encoding/sha256.js +0 -15
- package/dist/server/shared/encoding/sha256.js.map +0 -1
- package/dist/server/shared/logger.d.ts +0 -15
- package/dist/server/shared/logger.js +0 -16
- package/dist/server/shared/logger.js.map +0 -1
- package/dist/server/utils/cookie-utils.js +0 -21
- package/dist/server/utils/cookie-utils.js.map +0 -1
- package/dist/server/utils/dpop-utils.d.ts +0 -67
- package/dist/server/utils/dpop-utils.js +0 -75
- package/dist/server/utils/dpop-utils.js.map +0 -1
- package/dist/server/utils/env-utils.js +0 -54
- package/dist/server/utils/env-utils.js.map +0 -1
- package/dist/server/utils/jwk-utils.d.ts +0 -16
- package/dist/server/utils/jwk-utils.js +0 -24
- package/dist/server/utils/jwk-utils.js.map +0 -1
- package/dist/server/utils/jwt-utils.d.ts +0 -39
- package/dist/server/utils/jwt-utils.js +0 -87
- package/dist/server/utils/jwt-utils.js.map +0 -1
- package/src/server/hono/hubspot-connect-routes/auth-callback.test.ts +0 -225
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
import { HUBSPOT_APP_ORIGIN_COOKIE_NAME } from '../../constants.ts';
|
|
5
|
+
import { corsMiddleware } from './cors-middleware.ts';
|
|
6
|
+
|
|
7
|
+
const APP_ORIGIN = 'https://app.example.com';
|
|
8
|
+
const PINNED_ORIGIN = 'https://pinned.example.com';
|
|
9
|
+
|
|
10
|
+
function buildApp(): Hono {
|
|
11
|
+
const app = new Hono();
|
|
12
|
+
app.use('*', corsMiddleware());
|
|
13
|
+
app.get('/echo', (c) => c.json({ ok: true }));
|
|
14
|
+
app.post('/echo', (c) => c.json({ ok: true }));
|
|
15
|
+
return app;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('corsMiddleware', () => {
|
|
19
|
+
it('answers OPTIONS preflight with 204 + credentialed CORS headers', async () => {
|
|
20
|
+
const app = buildApp();
|
|
21
|
+
const res = await app.request('http://localhost/echo', {
|
|
22
|
+
method: 'OPTIONS',
|
|
23
|
+
headers: { Origin: APP_ORIGIN },
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
expect(res.status).toBe(204);
|
|
27
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe(APP_ORIGIN);
|
|
28
|
+
expect(res.headers.get('Access-Control-Allow-Credentials')).toBe('true');
|
|
29
|
+
expect(res.headers.get('Access-Control-Allow-Methods')).toContain('GET');
|
|
30
|
+
expect(res.headers.get('Access-Control-Allow-Methods')).toContain('POST');
|
|
31
|
+
expect(res.headers.get('Access-Control-Allow-Methods')).toContain(
|
|
32
|
+
'OPTIONS'
|
|
33
|
+
);
|
|
34
|
+
expect(res.headers.get('Access-Control-Allow-Headers')).toContain(
|
|
35
|
+
'authorization'
|
|
36
|
+
);
|
|
37
|
+
expect(res.headers.get('Access-Control-Allow-Headers')).toContain('apikey');
|
|
38
|
+
expect(res.headers.get('Access-Control-Max-Age')).toBe('600');
|
|
39
|
+
expect(res.headers.get('Vary')).toContain('Origin');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('echoes the request Origin when no pinned origin cookie is present', async () => {
|
|
43
|
+
const app = buildApp();
|
|
44
|
+
const res = await app.request('http://localhost/echo', {
|
|
45
|
+
method: 'GET',
|
|
46
|
+
headers: { Origin: APP_ORIGIN },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
expect(res.status).toBe(200);
|
|
50
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe(APP_ORIGIN);
|
|
51
|
+
expect(res.headers.get('Access-Control-Allow-Credentials')).toBe('true');
|
|
52
|
+
expect(res.headers.get('Vary')).toContain('Origin');
|
|
53
|
+
expect(res.headers.get('Vary')).toContain('Cookie');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('prefers the pinned `__Host-hs_app_origin` cookie over the Origin header', async () => {
|
|
57
|
+
const app = buildApp();
|
|
58
|
+
const res = await app.request('http://localhost/echo', {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
headers: {
|
|
61
|
+
Origin: APP_ORIGIN,
|
|
62
|
+
Cookie: `${HUBSPOT_APP_ORIGIN_COOKIE_NAME}=${PINNED_ORIGIN}`,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
expect(res.status).toBe(200);
|
|
67
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBe(PINNED_ORIGIN);
|
|
68
|
+
expect(res.headers.get('Access-Control-Allow-Credentials')).toBe('true');
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('omits CORS headers when the request has no Origin (server-to-server / curl)', async () => {
|
|
72
|
+
const app = buildApp();
|
|
73
|
+
const res = await app.request('http://localhost/echo', { method: 'GET' });
|
|
74
|
+
|
|
75
|
+
expect(res.status).toBe(200);
|
|
76
|
+
expect(res.headers.get('Access-Control-Allow-Origin')).toBeNull();
|
|
77
|
+
expect(res.headers.get('Access-Control-Allow-Credentials')).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Context, MiddlewareHandler } from 'hono';
|
|
2
|
+
|
|
3
|
+
import { HUBSPOT_APP_ORIGIN_COOKIE_NAME } from '../../constants.ts';
|
|
4
|
+
import { parseCookies } from '../../utils/cookie-utils.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Comma-separated list of request headers the SDK accepts on
|
|
8
|
+
* cross-site fetches. Mirrors the Supabase Edge Functions defaults
|
|
9
|
+
* the Lovable AI agent emits today, plus `content-type` for the
|
|
10
|
+
* `auth/complete` POST body and `accept` so JSON content negotiation
|
|
11
|
+
* works.
|
|
12
|
+
*/
|
|
13
|
+
const ALLOWED_HEADERS = [
|
|
14
|
+
'authorization',
|
|
15
|
+
'x-client-info',
|
|
16
|
+
'apikey',
|
|
17
|
+
'content-type',
|
|
18
|
+
'accept',
|
|
19
|
+
'x-supabase-client-platform',
|
|
20
|
+
'x-supabase-client-platform-version',
|
|
21
|
+
'x-supabase-client-runtime',
|
|
22
|
+
'x-supabase-client-runtime-version',
|
|
23
|
+
].join(', ');
|
|
24
|
+
|
|
25
|
+
const ALLOWED_METHODS = 'GET, POST, OPTIONS';
|
|
26
|
+
|
|
27
|
+
const PREFLIGHT_MAX_AGE_SECONDS = '600';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Reads the persisted app-origin cookie from the request, falling
|
|
31
|
+
* back to the literal `Origin` request header. The cookie is the
|
|
32
|
+
* authoritative pin once `auth/init-session` has run; on the very
|
|
33
|
+
* first init-session call (no cookie yet) we just echo whatever
|
|
34
|
+
* `Origin` the caller sent — the actual access decision is enforced
|
|
35
|
+
* by cookie-based authentication on every other route, not by CORS.
|
|
36
|
+
*/
|
|
37
|
+
function resolveAllowedOrigin(c: Context): string | null {
|
|
38
|
+
const cookies = parseCookies(c.req.header('Cookie'));
|
|
39
|
+
const pinned = cookies[HUBSPOT_APP_ORIGIN_COOKIE_NAME];
|
|
40
|
+
if (pinned) return pinned;
|
|
41
|
+
return c.req.header('Origin') ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function setSharedCorsHeaders(c: Context, allowOrigin: string): void {
|
|
45
|
+
c.res.headers.set('Access-Control-Allow-Origin', allowOrigin);
|
|
46
|
+
c.res.headers.set('Access-Control-Allow-Credentials', 'true');
|
|
47
|
+
// `Origin` so caches differentiate per-caller responses; `Cookie`
|
|
48
|
+
// because the allowed origin is derived from the persisted
|
|
49
|
+
// `__Host-hs_app_origin` cookie.
|
|
50
|
+
c.res.headers.set('Vary', 'Origin, Cookie');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Hono middleware that emits credentialed CORS response headers for
|
|
55
|
+
* the cross-origin Lovable / Supabase deployment shape.
|
|
56
|
+
*
|
|
57
|
+
* - On `OPTIONS` preflight: short-circuits with a 204 carrying
|
|
58
|
+
* `Access-Control-Allow-*` headers. The browser will then send the
|
|
59
|
+
* real request with cookies attached.
|
|
60
|
+
* - On every other method: echoes the pinned `__Host-hs_app_origin`
|
|
61
|
+
* cookie value (or, before init-session has run, the request
|
|
62
|
+
* `Origin` header) as `Access-Control-Allow-Origin`, with
|
|
63
|
+
* `Access-Control-Allow-Credentials: true`. The wildcard `*` is
|
|
64
|
+
* forbidden by browsers when credentials are included, so the
|
|
65
|
+
* middleware always echoes a concrete origin.
|
|
66
|
+
*
|
|
67
|
+
* Skips header emission entirely when the request has no `Origin`
|
|
68
|
+
* (server-to-server calls, curl, etc.) so non-browser callers are
|
|
69
|
+
* left untouched.
|
|
70
|
+
*/
|
|
71
|
+
export function corsMiddleware(): MiddlewareHandler {
|
|
72
|
+
return async (c, next) => {
|
|
73
|
+
const allowOrigin = resolveAllowedOrigin(c);
|
|
74
|
+
|
|
75
|
+
if (c.req.method === 'OPTIONS') {
|
|
76
|
+
const headers = new Headers();
|
|
77
|
+
if (allowOrigin) {
|
|
78
|
+
headers.set('Access-Control-Allow-Origin', allowOrigin);
|
|
79
|
+
headers.set('Access-Control-Allow-Credentials', 'true');
|
|
80
|
+
headers.set('Vary', 'Origin, Cookie');
|
|
81
|
+
}
|
|
82
|
+
headers.set('Access-Control-Allow-Methods', ALLOWED_METHODS);
|
|
83
|
+
headers.set('Access-Control-Allow-Headers', ALLOWED_HEADERS);
|
|
84
|
+
headers.set('Access-Control-Max-Age', PREFLIGHT_MAX_AGE_SECONDS);
|
|
85
|
+
return new Response(null, { status: 204, headers });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
await next();
|
|
89
|
+
|
|
90
|
+
if (allowOrigin) {
|
|
91
|
+
setSharedCorsHeaders(c, allowOrigin);
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -10,18 +10,17 @@ function serializeCookies(cookies: Map<string, string>): string {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* protected cookie
|
|
15
|
-
*
|
|
16
|
-
* remain, the header is dropped entirely.
|
|
13
|
+
* Mutates `headers` in place: parses the `Cookie` header, drops every
|
|
14
|
+
* protected cookie (see {@link isProtectedCookieName}), and rewrites
|
|
15
|
+
* the header. Deletes the header entirely when nothing survives.
|
|
17
16
|
*
|
|
18
|
-
* Used by
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Used by the SDK's auth middleware after it has read the access
|
|
18
|
+
* token / session ID, so user route handlers never see — and
|
|
19
|
+
* therefore cannot leak — those cookies, while CORS / auth
|
|
20
|
+
* middleware that ran first still got the raw values.
|
|
21
21
|
*/
|
|
22
|
-
export function
|
|
23
|
-
const cookies = parseCookies(
|
|
24
|
-
|
|
22
|
+
export function stripProtectedCookies(headers: Headers): void {
|
|
23
|
+
const cookies = parseCookies(headers.get('Cookie'));
|
|
25
24
|
const surviving = new Map<string, string>();
|
|
26
25
|
for (const [name, value] of Object.entries(cookies)) {
|
|
27
26
|
if (!isProtectedCookieName(name)) {
|
|
@@ -29,12 +28,27 @@ export function sanitizeRequest(original: Request): Request {
|
|
|
29
28
|
}
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
const headers = new Headers(original.headers);
|
|
33
31
|
if (surviving.size === 0) {
|
|
34
32
|
headers.delete('cookie');
|
|
35
33
|
} else {
|
|
36
34
|
headers.set('cookie', serializeCookies(surviving));
|
|
37
35
|
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Returns a clone of `original` whose `Cookie` header has every
|
|
40
|
+
* protected cookie removed (see {@link isProtectedCookieName}). When
|
|
41
|
+
* no other cookies remain, the header is dropped entirely.
|
|
42
|
+
*
|
|
43
|
+
* Standalone helper retained for callers that want a new Request
|
|
44
|
+
* (e.g. tests). Inside the SDK's per-request handler, the auth
|
|
45
|
+
* middleware uses {@link stripProtectedCookies} directly on
|
|
46
|
+
* `c.req.raw.headers` so the auth check itself can still read the
|
|
47
|
+
* protected cookies before they are stripped.
|
|
48
|
+
*/
|
|
49
|
+
export function sanitizeRequest(original: Request): Request {
|
|
50
|
+
const headers = new Headers(original.headers);
|
|
51
|
+
stripProtectedCookies(headers);
|
|
38
52
|
|
|
39
53
|
const init: RequestInit = {
|
|
40
54
|
method: original.method,
|
package/src/server/types.ts
CHANGED
package/src/shared/constants.ts
CHANGED
|
@@ -6,8 +6,36 @@
|
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Query parameter on the OAuth return URL that carries the new access
|
|
9
|
-
* token's expiry (Unix epoch milliseconds). The
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* token's expiry (Unix epoch milliseconds). The browser controller
|
|
10
|
+
* sets this in the URL after a successful `auth/complete` call and
|
|
11
|
+
* then strips it during `initAppConnect` via `history.replaceState`.
|
|
12
12
|
*/
|
|
13
13
|
export const EXPIRES_AT_URL_PARAM = '__hs_expires_at';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Path the browser visits after HubSpot's authorize endpoint
|
|
17
|
+
* redirects back to the app. Mounted on the **frontend** origin (not
|
|
18
|
+
* the SDK's edge function host) so all OAuth-related cookies live in
|
|
19
|
+
* the `(frontend, edge)` CHIPS partition.
|
|
20
|
+
*
|
|
21
|
+
* The SDK's `auth/init-session` builds the OAuth `redirect_uri` as
|
|
22
|
+
* `${requestOrigin}${HUBSPOT_FRONTEND_CALLBACK_PATH}`. The browser
|
|
23
|
+
* controller, on `start()`, recognizes this path on `window.location`
|
|
24
|
+
* and forwards `?code` + `?state` to the SDK's `auth/complete`
|
|
25
|
+
* endpoint via a credentialed cross-site fetch. The host app must
|
|
26
|
+
* register `${app_origin}${HUBSPOT_FRONTEND_CALLBACK_PATH}` as a
|
|
27
|
+
* redirect URI in its HubSpot app settings.
|
|
28
|
+
*/
|
|
29
|
+
export const HUBSPOT_FRONTEND_CALLBACK_PATH = '/__hubspot_oauth_callback';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Query parameter on the `auth/complete` POST request carrying the
|
|
33
|
+
* authorization `code` HubSpot returned to the frontend callback.
|
|
34
|
+
*/
|
|
35
|
+
export const AUTH_COMPLETE_CODE_PARAM = 'code';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Query parameter on the `auth/complete` POST request carrying the
|
|
39
|
+
* OAuth `state` HubSpot echoed back to the frontend callback.
|
|
40
|
+
*/
|
|
41
|
+
export const AUTH_COMPLETE_STATE_PARAM = 'state';
|
package/src/shared/wire-types.ts
CHANGED
|
@@ -15,6 +15,25 @@ export interface InitSessionResponse {
|
|
|
15
15
|
authorization_url: string;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Body returned by `POST /auth/complete` once the SDK has exchanged
|
|
20
|
+
* the OAuth authorization code for an access + refresh token. The
|
|
21
|
+
* SDK has set the durable session cookies on the response by this
|
|
22
|
+
* point; the browser controller uses these fields to update its
|
|
23
|
+
* client-side expiry tracking and to navigate the user back to the
|
|
24
|
+
* page they started the connect flow from.
|
|
25
|
+
*/
|
|
26
|
+
export interface AuthCompleteResponse {
|
|
27
|
+
/** Access-token expiry as Unix epoch milliseconds. */
|
|
28
|
+
expires_at: number;
|
|
29
|
+
/**
|
|
30
|
+
* Path the browser should land on after the connect flow finishes,
|
|
31
|
+
* carried through the OAuth `state` round-trip. Always begins with
|
|
32
|
+
* `/` and is restricted to safe internal paths.
|
|
33
|
+
*/
|
|
34
|
+
return_path: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
18
37
|
/**
|
|
19
38
|
* Body returned by `POST /auth/refresh` after a successful access-token
|
|
20
39
|
* refresh.
|
package/tsdown.config.ts
CHANGED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[2m$ prettier --check . --ignore-path ../../.prettierignore[22m
|
|
3
|
-
Checking formatting...
|
|
4
|
-
.turbo/turbo-format$colon$check.log[2K[1G.turbo/turbo-lint.log[2K[1G.turbo/turbo-tsc.log[2K[1G.turbo/turbo-tsdown.log[2K[1Geslint.config.js[2K[1Gpackage.json[2K[1GREADME.md[2K[1Gsrc/browser/app-connect-controller/connect-start.ts[2K[1Gsrc/browser/app-connect-controller/constants.ts[2K[1Gsrc/browser/app-connect-controller/create.ts[2K[1Gsrc/browser/app-connect-controller/default-session-storage.ts[2K[1Gsrc/browser/app-connect-controller/disconnect.ts[2K[1Gsrc/browser/app-connect-controller/init.ts[2K[1Gsrc/browser/app-connect-controller/README.md[2K[1Gsrc/browser/app-connect-controller/refresh.ts[2K[1Gsrc/browser/app-connect-controller/types.ts[2K[1Gsrc/browser/app-connect-controller/utils/crypto-utils.ts[2K[1Gsrc/browser/app-connect-controller/utils/encode-utils.ts[2K[1Gsrc/browser/app-connect-controller/utils/memoize-utils.test.ts[2K[1Gsrc/browser/app-connect-controller/utils/memoize-utils.ts[2K[1Gsrc/browser/app-connect-controller/utils/session-utils.test.ts[2K[1Gsrc/browser/app-connect-controller/utils/session-utils.ts[2K[1Gsrc/browser/app-connect-controller/utils/store-utils.test.ts[2K[1Gsrc/browser/app-connect-controller/utils/store-utils.ts[2K[1Gsrc/browser/app-connect-controller/utils/timeout-utils.ts[2K[1Gsrc/browser/app-connect-controller/view-state.test.ts[2K[1Gsrc/browser/app-connect-controller/view-state.ts[2K[1Gsrc/browser/index.ts[2K[1Gsrc/browser/react/components/AppConnectHeader/AppConnectHeader.css.ts[2K[1Gsrc/browser/react/components/AppConnectHeader/AppConnectHeader.tsx[2K[1Gsrc/browser/react/components/Button/Button.css.ts[2K[1Gsrc/browser/react/components/Button/Button.tsx[2K[1Gsrc/browser/react/components/ConnectButton/ConnectButton.css.ts[2K[1Gsrc/browser/react/components/ConnectButton/ConnectButton.tsx[2K[1Gsrc/browser/react/components/DisconnectedBody/DisconnectedBody.css.ts[2K[1Gsrc/browser/react/components/DisconnectedBody/DisconnectedBody.tsx[2K[1Gsrc/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.css.ts[2K[1Gsrc/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.tsx[2K[1Gsrc/browser/react/components/icons/ChevronDownIcon.tsx[2K[1Gsrc/browser/react/components/icons/ExternalLinkIcon.tsx[2K[1Gsrc/browser/react/components/icons/HubSpotDataSourceIcon.tsx[2K[1Gsrc/browser/react/components/icons/LogoutIcon.tsx[2K[1Gsrc/browser/react/components/icons/ShareIcon.tsx[2K[1Gsrc/browser/react/components/LoadingIndicator/LoadingIndicator.css.ts[2K[1Gsrc/browser/react/components/LoadingIndicator/LoadingIndicator.tsx[2K[1Gsrc/browser/react/components/ShareButton/ShareButton.css.ts[2K[1Gsrc/browser/react/components/ShareButton/ShareButton.tsx[2K[1Gsrc/browser/react/context.ts[2K[1Gsrc/browser/react/hooks.ts[2K[1Gsrc/browser/react/index.ts[2K[1Gsrc/browser/react/lovable/index.ts[2K[1Gsrc/browser/react/lovable/LovableHubSpotAppConnect.tsx[2K[1Gsrc/browser/theme-tokens.generated.css.ts[2K[1Gsrc/browser/theme.css.ts[2K[1Gsrc/browser/types.ts[2K[1Gsrc/server/api-client-core/apis/account/account-info-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/account/account-info.generated.ts[2K[1Gsrc/server/api-client-core/apis/account/audit-logs-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/account/audit-logs.generated.ts[2K[1Gsrc/server/api-client-core/apis/auth/oauth-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/auth/oauth.generated.ts[2K[1Gsrc/server/api-client-core/apis/automation/actions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/automation/actions.generated.ts[2K[1Gsrc/server/api-client-core/apis/automation/sequences-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/automation/sequences.generated.ts[2K[1Gsrc/server/api-client-core/apis/business-units-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/business-units.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/authors-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/authors.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/blog-settings-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/blog-settings.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/cms-content-audit-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/cms-content-audit.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/domains-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/domains.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/hubdb-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/hubdb.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/media-bridge-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/media-bridge.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/pages-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/pages.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/posts-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/posts.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/site-search-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/site-search.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/source-code-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/source-code.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/tags-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/tags.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/url-mappings-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/url-mappings.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/url-redirects-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/cms/url-redirects.generated.ts[2K[1Gsrc/server/api-client-core/apis/communication-preferences/subscriptions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/communication-preferences/subscriptions.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations/custom-channels-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations/custom-channels.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations/visitor-identification-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/conversations/visitor-identification.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/app-uninstalls-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/app-uninstalls.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/appointments-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/appointments.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/associations-schema-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/associations-schema.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/associations-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/associations.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/calling-extensions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/calling-extensions.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/calls-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/calls.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/carts-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/carts.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/commerce-payments-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/commerce-payments.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/commerce-subscriptions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/commerce-subscriptions.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/communications-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/communications.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/companies-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/companies.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/contacts-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/contacts.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/contracts-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/contracts.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/courses-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/courses.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/crm-owners-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/crm-owners.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/custom-objects-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/custom-objects.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/deal-splits-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/deal-splits.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/deals-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/deals.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/discounts-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/discounts.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/emails-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/emails.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/exports-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/exports.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/feedback-submissions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/feedback-submissions.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/fees-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/fees.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/goal-targets-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/goal-targets.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/imports-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/imports.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/invoices-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/invoices.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/leads-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/leads.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/limits-tracking-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/limits-tracking.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/line-items-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/line-items.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/listings-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/listings.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/lists-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/lists.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/meetings-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/meetings.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/notes-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/notes.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/object-library-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/object-library.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/objects-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/objects.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/orders-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/orders.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/partner-clients-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/partner-clients.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/partner-services-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/partner-services.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/pipelines-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/pipelines.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/postal-mail-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/postal-mail.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/products-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/products.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/projects-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/projects.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/properties-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/properties.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/property-validations-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/property-validations.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/public-app-crm-cards-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/public-app-crm-cards.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/public-app-feature-flags-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/public-app-feature-flags.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/quotes-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/quotes.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/schemas-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/schemas.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/services-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/services.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/tasks-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/tasks.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/taxes-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/taxes.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/tickets-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/tickets.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/timeline-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/timeline.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/transcriptions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/transcriptions.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/users-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/users.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/video-conferencing-extension-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/crm/video-conferencing-extension.generated.ts[2K[1Gsrc/server/api-client-core/apis/events-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/events.generated.ts[2K[1Gsrc/server/api-client-core/apis/events/manage-event-definitions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/events/manage-event-definitions.generated.ts[2K[1Gsrc/server/api-client-core/apis/events/send-event-completions-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/events/send-event-completions.generated.ts[2K[1Gsrc/server/api-client-core/apis/files-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/files.generated.ts[2K[1Gsrc/server/api-client-core/apis/index.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/campaigns-public-api-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/campaigns-public-api.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/marketing-emails-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/marketing-emails.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/marketing-events-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/marketing-events.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/single-send-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/single-send.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/transactional-single-send-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/marketing/transactional-single-send.generated.ts[2K[1Gsrc/server/api-client-core/apis/meta/origins-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/meta/origins.generated.ts[2K[1Gsrc/server/api-client-core/apis/scheduler/meetings-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/scheduler/meetings.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/multicurrency-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/multicurrency.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/tax-rates-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/tax-rates.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/user-provisioning-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/settings/user-provisioning.generated.ts[2K[1Gsrc/server/api-client-core/apis/webhooks-journal-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/webhooks-journal.generated.ts[2K[1Gsrc/server/api-client-core/apis/webhooks-types.generated.ts[2K[1Gsrc/server/api-client-core/apis/webhooks.generated.ts[2K[1Gsrc/server/api-client-core/binary-data.ts[2K[1Gsrc/server/api-client-core/client.ts[2K[1Gsrc/server/api-client-core/codegen-helpers/file-op-wrappers.ts[2K[1Gsrc/server/api-client-core/errors.ts[2K[1Gsrc/server/api-client-core/index.ts[2K[1Gsrc/server/api-client-core/op.ts[2K[1Gsrc/server/api-client-core/pagination.ts[2K[1Gsrc/server/api-client-core/plugins/fetch-transport.ts[2K[1Gsrc/server/api-client-core/plugins/index.ts[2K[1Gsrc/server/api-client-core/types.ts[2K[1Gsrc/server/api-client.ts[2K[1Gsrc/server/constants.ts[2K[1Gsrc/server/deno/index.ts[2K[1Gsrc/server/deno/start.ts[2K[1Gsrc/server/hono/hono-request-handler.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-callback.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-callback.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-init-session.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-init-session.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-logout.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-logout.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-refresh.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/auth-refresh.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/cimd-client-metadata-types.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/cimd-public-routes.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/cimd-public-routes.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/constants.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/hubspot-connect-routes.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/oauth-client.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/types.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/utils.test.ts[2K[1Gsrc/server/hono/hubspot-connect-routes/utils.ts[2K[1Gsrc/server/hono/index.ts[2K[1Gsrc/server/hono/types.ts[2K[1Gsrc/server/hono/utils/cookie-utils.ts[2K[1Gsrc/server/import-app-keys.ts[2K[1Gsrc/server/lovable/create-app-function-start.ts[2K[1Gsrc/server/lovable/hubspot-connect/index.ts[2K[1Gsrc/server/lovable/hubspot-connect/run-hubspot-connect-lovable-server.ts[2K[1Gsrc/server/lovable/index.ts[2K[1Gsrc/server/node/index.ts[2K[1Gsrc/server/node/start.ts[2K[1Gsrc/server/oauth.ts[2K[1Gsrc/server/proxy.test.ts[2K[1Gsrc/server/proxy.ts[2K[1Gsrc/server/sanitize-request.test.ts[2K[1Gsrc/server/sanitize-request.ts[2K[1Gsrc/server/secure-start-core.ts[2K[1Gsrc/server/types.ts[2K[1Gsrc/server/utils/base64-utils.ts[2K[1Gsrc/server/utils/cookie-utils.test.ts[2K[1Gsrc/server/utils/cookie-utils.ts[2K[1Gsrc/server/utils/crypto-utils.ts[2K[1Gsrc/server/utils/dpop-utils.test.ts[2K[1Gsrc/server/utils/dpop-utils.ts[2K[1Gsrc/server/utils/env-utils.test.ts[2K[1Gsrc/server/utils/env-utils.ts[2K[1Gsrc/server/utils/jwk-utils.test.ts[2K[1Gsrc/server/utils/jwk-utils.ts[2K[1Gsrc/server/utils/jwt-utils.test.ts[2K[1Gsrc/server/utils/jwt-utils.ts[2K[1Gsrc/server/utils/test-fixtures.ts[2K[1Gsrc/shared/constants.ts[2K[1Gsrc/shared/encoding/base64.test.ts[2K[1Gsrc/shared/encoding/base64.ts[2K[1Gsrc/shared/encoding/sha256.test.ts[2K[1Gsrc/shared/encoding/sha256.ts[2K[1Gsrc/shared/logger.ts[2K[1Gsrc/shared/wire-types.ts[2K[1Gtsconfig.browser.json[2K[1Gtsconfig.json[2K[1Gtsconfig.server.json[2K[1Gtsdown.config.ts[2K[1Gvitest.config.ts[2K[1GAll matched files use Prettier code style!
|
package/.turbo/turbo-lint.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[2m$ vitest run[22m
|
|
3
|
-
[?25l
|
|
4
|
-
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90m/Users/psteeleidem/src/HubSpotEngineering/app-connect-sdk/packages/app-connect-sdk[39m
|
|
5
|
-
|
|
6
|
-
[?2026h
|
|
7
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts[2m [queued][22m
|
|
8
|
-
|
|
9
|
-
[2m Test Files [22m[1m[32m0 passed[39m[22m[90m (21)[39m
|
|
10
|
-
[2m Tests [22m[1m[32m0 passed[39m[22m[90m (0)[39m
|
|
11
|
-
[2m Start at [22m13:43:31
|
|
12
|
-
[2m Duration [22m101ms
|
|
13
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/browser/app-connect-controller/utils/store-utils.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
14
|
-
[32m✓[39m src/server/utils/env-utils.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
15
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
16
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/utils.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
17
|
-
[32m✓[39m src/browser/app-connect-controller/utils/session-utils.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
18
|
-
[32m✓[39m src/server/utils/jwt-utils.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
19
|
-
|
|
20
|
-
[1m[33m ❯ [39m[22msrc/browser/app-connect-controller/utils/session-utils.test.ts[2m 9/9[22m
|
|
21
|
-
[1m[33m ❯ [39m[22msrc/browser/app-connect-controller/utils/store-utils.test.ts[2m 11/11[22m
|
|
22
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/auth-callback.test.ts[2m [queued][22m
|
|
23
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/auth-init-session.test.ts[2m 0/4[22m
|
|
24
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/auth-logout.test.ts[2m [queued][22m
|
|
25
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/auth-refresh.test.ts[2m [queued][22m
|
|
26
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/cimd-public-routes.test.ts[2m 0/4[22m
|
|
27
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/load-hubspot-connect-routes-env.test.ts[2m 11/11[22m
|
|
28
|
-
[1m[33m ❯ [39m[22msrc/server/hono/hubspot-connect-routes/utils.test.ts[2m 10/10[22m
|
|
29
|
-
[1m[33m ❯ [39m[22msrc/server/proxy.test.ts[2m 0/3[22m
|
|
30
|
-
[1m[33m ❯ [39m[22msrc/server/utils/dpop-utils.test.ts[2m 0/7[22m
|
|
31
|
-
[1m[33m ❯ [39m[22msrc/server/utils/env-utils.test.ts[2m 13/13[22m
|
|
32
|
-
[1m[33m ❯ [39m[22msrc/server/utils/jwt-utils.test.ts[2m 6/6[22m
|
|
33
|
-
|
|
34
|
-
[2m Test Files [22m[1m[32m6 passed[39m[22m[90m (21)[39m
|
|
35
|
-
[2m Tests [22m[1m[32m60 passed[39m[22m[90m (78)[39m
|
|
36
|
-
[2m Start at [22m13:43:31
|
|
37
|
-
[2m Duration [22m202ms
|
|
38
|
-
[?2026l[?2026h[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/server/hono/hubspot-connect-routes/cimd-public-routes.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
|
|
39
|
-
[32m✓[39m src/server/utils/dpop-utils.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 20[2mms[22m[39m
|
|
40
|
-
[32m✓[39m src/server/proxy.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 56[2mms[22m[39m
|
|
41
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/auth-logout.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
42
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/auth-init-session.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 21[2mms[22m[39m
|
|
43
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/auth-callback.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
|
|
44
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/auth-refresh.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 18[2mms[22m[39m
|
|
45
|
-
[32m✓[39m src/server/hono/hubspot-connect-routes/fetch-hubspot-client-metadata.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
46
|
-
[32m✓[39m src/shared/encoding/base64.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
47
|
-
[32m✓[39m src/browser/app-connect-controller/view-state.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 1[2mms[22m[39m
|
|
48
|
-
[32m✓[39m src/server/sanitize-request.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
|
|
49
|
-
[32m✓[39m src/server/utils/cookie-utils.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
[1m[33m ❯ [39m[22msrc/browser/app-connect-controller/utils/memoize-utils.test.ts[2m 1/4[22m
|
|
60
|
-
[1m[33m ❯ [39m[22msrc/server/utils/jwk-utils.test.ts[2m [queued][22m
|
|
61
|
-
[1m[33m ❯ [39m[22msrc/shared/encoding/sha256.test.ts[2m [queued][22m
|
|
62
|
-
|
|
63
|
-
[2m Test Files [22m[1m[32m18 passed[39m[22m[90m (21)[39m
|
|
64
|
-
[2m Tests [22m[1m[32m128 passed[39m[22m[90m (131)[39m
|
|
65
|
-
[2m Start at [22m13:43:31
|
|
66
|
-
[2m Duration [22m302ms
|
|
67
|
-
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/browser/app-connect-controller/utils/memoize-utils.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 2[2mms[22m[39m
|
|
68
|
-
[32m✓[39m src/shared/encoding/sha256.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
69
|
-
[32m✓[39m src/server/utils/jwk-utils.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
70
|
-
|
|
71
|
-
[2m Test Files [22m [1m[32m21 passed[39m[22m[90m (21)[39m
|
|
72
|
-
[2m Tests [22m [1m[32m137 passed[39m[22m[90m (137)[39m
|
|
73
|
-
[2m Start at [22m 13:43:31
|
|
74
|
-
[2m Duration [22m 379ms[2m (transform 631ms, setup 0ms, import 1.07s, tests 215ms, environment 1ms)[22m
|
|
75
|
-
|
|
76
|
-
[?25h
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HubSpotAppConnect-BW45gyDs.js","names":["styles.root","styles.variant","variant","styles.size","size","styles","styles","styles","styles"],"sources":["../../src/browser/react/context.ts","../../src/browser/react/hooks.ts","../../src/browser/react/components/Button/Button.css.ts","../../src/browser/react/components/Button/Button.tsx","../../src/browser/react/components/ConnectButton/ConnectButton.css.ts","../../src/browser/react/components/ConnectButton/ConnectButton.tsx","../../src/browser/react/components/icons/ChevronDownIcon.tsx","../../src/browser/react/components/icons/ExternalLinkIcon.tsx","../../src/browser/react/components/icons/HubSpotDataSourceIcon.tsx","../../src/browser/react/components/icons/LogoutIcon.tsx","../../src/browser/react/components/icons/ShareIcon.tsx","../../src/browser/react/components/ShareButton/ShareButton.css.ts","../../src/browser/react/components/ShareButton/ShareButton.tsx","../../src/browser/react/components/AppConnectHeader/AppConnectHeader.css.ts","../../src/browser/react/components/AppConnectHeader/AppConnectHeader.tsx","../../src/browser/react/components/DisconnectedBody/DisconnectedBody.css.ts","../../src/browser/react/components/DisconnectedBody/DisconnectedBody.tsx","../../src/browser/react/components/LoadingIndicator/LoadingIndicator.css.ts","../../src/browser/react/components/LoadingIndicator/LoadingIndicator.tsx","../../src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.css.ts","../../src/browser/react/components/HubSpotAppConnect/HubSpotAppConnect.tsx"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { AppConnectController } from '../types.ts';\n\n/**\n * React context that carries the `AppConnectController` from the\n * `HubSpotAppConnect` provider down to consumers of\n * `useHubSpotAppConnect`. `null` indicates the hook is being used\n * outside a provider.\n */\nexport const HubSpotAppConnectControllerContext =\n createContext<AppConnectController | null>(null);\n","import { useContext, useSyncExternalStore } from 'react';\n\nimport type { AppConnectState } from '../types.ts';\nimport { HubSpotAppConnectControllerContext } from './context.ts';\n\nexport type UseHubSpotAppConnectResult = AppConnectState;\n\n/**\n * React hook that returns the current `AppConnectState`. Must be\n * called inside a {@link HubSpotAppConnect} provider — throws when\n * no controller is available.\n *\n * The hook subscribes to the controller via `useSyncExternalStore`\n * so React 18+ batched updates and SSR work correctly.\n */\nexport function useHubSpotAppConnect(): UseHubSpotAppConnectResult {\n const controller = useContext(HubSpotAppConnectControllerContext);\n if (controller == null) {\n throw new Error(\n 'useHubSpotAppConnect must be used within HubSpotAppConnect'\n );\n }\n return useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getServerSnapshot\n );\n}\n","import { style, styleVariants } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const root = style({\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n font: 'inherit',\n fontWeight: 500,\n lineHeight: 'inherit',\n textAlign: 'center',\n cursor: 'pointer',\n borderWidth: 1,\n borderStyle: 'solid',\n borderRadius: themeVars.borderRadius[100],\n transition:\n 'background-color 120ms ease, border-color 120ms ease, color 120ms ease, opacity 120ms ease',\n selectors: {\n '&:disabled': {\n cursor: 'wait',\n opacity: 0.55,\n },\n },\n});\n\nexport const variant = styleVariants({\n primary: {\n backgroundColor: themeVars.fill.primary.default,\n color: themeVars.text.primary.default,\n borderColor: themeVars.border.primary.default,\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.95)',\n },\n },\n },\n secondary: {\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderColor: themeVars.border.core.default,\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: '#f7f7f7',\n },\n },\n },\n});\n\nexport const size = styleVariants({\n md: {\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n fontSize: 14,\n },\n lg: {\n padding: `${themeVars.space[300]} ${themeVars.space[500]}`,\n fontSize: 16,\n },\n});\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nimport * as styles from './Button.css.ts';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonSize = 'md' | 'lg';\n\nexport interface ButtonProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n children: ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nexport function Button({\n children,\n className,\n variant = 'primary',\n size = 'md',\n type = 'button',\n ...rest\n}: ButtonProps) {\n const composedClassName = [\n styles.root,\n styles.variant[variant],\n styles.size[size],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button {...rest} type={type} className={composedClassName}>\n {children}\n </button>\n );\n}\n","import { keyframes, style, styleVariants } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst spin = keyframes({\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const root = style({\n position: 'relative',\n});\n\nexport const label = style({\n position: 'relative',\n zIndex: 0,\n});\n\nexport const labelMuted = style({\n opacity: 0.22,\n});\n\nexport const loadingBackdrop = styleVariants({\n primary: {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n marginLeft: -18,\n marginTop: -18,\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.88)',\n boxShadow: '0 1px 6px rgba(0, 0, 0, 0.14)',\n pointerEvents: 'none',\n },\n secondary: {\n position: 'absolute',\n left: '50%',\n top: '50%',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n marginLeft: -18,\n marginTop: -18,\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.82)',\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.08)',\n pointerEvents: 'none',\n },\n});\n\nexport const spinner = style({\n display: 'block',\n width: 14,\n height: 14,\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderTopColor: themeVars.fill.primary.default,\n borderRadius: '50%',\n animation: `${spin} 0.8s linear infinite`,\n});\n","import { useHubSpotAppConnect } from '../../hooks.ts';\nimport type { ButtonProps } from '../Button/Button.tsx';\nimport { Button } from '../Button/Button.tsx';\nimport {\n label,\n labelMuted,\n loadingBackdrop,\n root,\n spinner,\n} from './ConnectButton.css.ts';\n\nexport interface ConnectButtonProps extends Pick<\n ButtonProps,\n 'variant' | 'size' | 'className'\n> {}\n\nexport function ConnectButton({\n variant = 'primary',\n size = 'md',\n className,\n}: ConnectButtonProps) {\n const { status, connectToHubSpot } = useHubSpotAppConnect();\n const isConnecting = status === 'connecting';\n const composedClassName = [root, className].filter(Boolean).join(' ');\n const labelClassName = isConnecting ? `${label} ${labelMuted}` : label;\n return (\n <Button\n variant={variant}\n size={size}\n className={composedClassName}\n aria-busy={isConnecting}\n onClick={() => void connectToHubSpot()}\n disabled={isConnecting}\n >\n <span className={labelClassName}>Connect to HubSpot</span>\n {isConnecting ? (\n <span className={loadingBackdrop[variant]} aria-hidden=\"true\">\n <span className={spinner} />\n </span>\n ) : null}\n </Button>\n );\n}\n","export interface ChevronDownIconProps {\n className?: string;\n}\n\nexport function ChevronDownIcon({ className }: ChevronDownIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface ExternalLinkIconProps {\n className?: string;\n}\n\nexport function ExternalLinkIcon({ className }: ExternalLinkIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.5 3.5H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2.5M10 2.5h3.5V6M9 7l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface HubSpotDataSourceIconProps {\n className?: string;\n}\n\nexport function HubSpotDataSourceIcon({\n className,\n}: HubSpotDataSourceIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"2.5\"\n y=\"2.5\"\n width=\"11\"\n height=\"11\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M5 6h6M5 8.25h6M5 10.5h4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","export interface LogoutIconProps {\n className?: string;\n}\n\nexport function LogoutIcon({ className }: LogoutIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.5 2.5h-3a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 11l3-3-3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M13.5 8h-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export interface ShareIconProps {\n className?: string;\n}\n\nexport function ShareIcon({ className }: ShareIconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"18\" cy=\"5\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"6\" cy=\"12\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle\n cx=\"18\"\n cy=\"19\"\n r=\"2.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.6 10.5L15.4 6.5M8.6 13.5L15.4 17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst shareBorder = '#cbd6e2';\nconst shareText = '#33475b';\n\nexport const styles = {\n shareButton: style({\n flexShrink: 0,\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n fontFamily: 'inherit',\n fontSize: 14,\n fontWeight: 500,\n lineHeight: 1,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: themeVars.space[200],\n padding: `8px ${themeVars.space[300]}`,\n color: shareText,\n backgroundColor: themeVars.fill.surface.default.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: shareBorder,\n borderRadius: 100,\n transition:\n 'background-color 120ms ease, border-color 120ms ease, color 120ms ease',\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: '#f5f8fa',\n },\n '&:focus-visible': {\n outline: `2px solid ${themeVars.border.tertiary.default}`,\n outlineOffset: 2,\n },\n '&:disabled': {\n cursor: 'not-allowed',\n opacity: 0.55,\n },\n },\n }),\n shareIcon: style({\n width: 16,\n height: 16,\n flexShrink: 0,\n display: 'block',\n }),\n} as const;\n","import { ShareIcon } from '../icons/ShareIcon.tsx';\nimport { styles } from './ShareButton.css.ts';\n\ninterface ShareAppConnectPageOptions {\n pageTitle: string;\n}\n\nasync function shareAppConnectPage(\n options: ShareAppConnectPageOptions\n): Promise<void> {\n const { pageTitle } = options;\n const url = window.location.href;\n if (typeof navigator.share === 'function') {\n try {\n await navigator.share({ title: pageTitle, text: pageTitle, url });\n return;\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n }\n }\n if (typeof navigator.clipboard?.writeText === 'function') {\n await navigator.clipboard.writeText(url);\n }\n}\n\nexport interface ShareButtonProps {\n pageTitle: string;\n}\n\nexport function ShareButton({ pageTitle }: ShareButtonProps) {\n return (\n <button\n type=\"button\"\n className={styles.shareButton}\n onClick={() => void shareAppConnectPage({ pageTitle })}\n >\n <ShareIcon className={styles.shareIcon} />\n <span>Share</span>\n </button>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst avatarOrange = themeVars.fill.brand.default;\nconst avatarTextColor = themeVars.text.primary.default;\n\nexport const styles = {\n header: style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: themeVars.space[300],\n paddingBottom: themeVars.space[300],\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: themeVars.border.core.subtle.default,\n }),\n titleRow: style({\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n }),\n leftStack: style({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: themeVars.space[200],\n minWidth: 0,\n flex: 1,\n }),\n contextRow: style({\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 14,\n lineHeight: 1.35,\n color: themeVars.text.core.subtle,\n minWidth: 0,\n }),\n contextIcon: style({\n width: 16,\n height: 16,\n flexShrink: 0,\n color: themeVars.text.core.subtle,\n }),\n contextPrefix: style({\n flexShrink: 0,\n }),\n contextLink: style({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n color: themeVars.fill.brand.default,\n textDecoration: 'none',\n fontWeight: 500,\n selectors: {\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n }),\n contextExternalIcon: style({\n width: 14,\n height: 14,\n flexShrink: 0,\n }),\n titleCluster: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n width: 'max-content',\n maxWidth: '100%',\n minWidth: 0,\n }),\n title: style({\n flex: '0 1 auto',\n fontSize: 20,\n fontWeight: 600,\n margin: 0,\n color: themeVars.text.core.default,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n userTrigger: style({\n appearance: 'none',\n WebkitAppearance: 'none',\n margin: 0,\n font: 'inherit',\n lineHeight: 1,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n padding: `6px ${themeVars.space[300]} 6px 6px`,\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.default,\n borderRadius: 999,\n transition: 'background-color 120ms ease, border-color 120ms ease',\n selectors: {\n '&:hover': {\n backgroundColor: '#f7f7f7',\n },\n '&[data-popup-open]': {\n backgroundColor: '#f7f7f7',\n },\n },\n }),\n triggerName: style({\n fontWeight: 500,\n fontSize: 14,\n }),\n chevron: style({\n width: 14,\n height: 14,\n color: themeVars.text.core.subtle,\n transition: 'transform 150ms ease',\n selectors: {\n '[data-popup-open] &': {\n transform: 'rotate(180deg)',\n },\n },\n }),\n avatar: style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: avatarOrange,\n color: avatarTextColor,\n fontWeight: 600,\n flexShrink: 0,\n borderRadius: '50%',\n userSelect: 'none',\n }),\n avatarSm: style({\n width: 28,\n height: 28,\n fontSize: 11,\n }),\n avatarLg: style({\n width: 40,\n height: 40,\n fontSize: 14,\n }),\n popup: style({\n minWidth: 240,\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderRadius: themeVars.borderRadius[300],\n boxShadow:\n '0 6px 16px rgba(17, 17, 17, 0.08), 0 2px 6px rgba(17, 17, 17, 0.04)',\n padding: `${themeVars.space[200]} 0`,\n outline: 'none',\n transformOrigin: 'top right',\n opacity: 0,\n transform: 'scale(0.96)',\n transition: 'opacity 120ms ease, transform 120ms ease',\n selectors: {\n '&[data-starting-style]': {\n opacity: 0,\n transform: 'scale(0.96)',\n },\n '&[data-open]': {\n opacity: 1,\n transform: 'scale(1)',\n },\n },\n }),\n userInfo: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[300],\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n }),\n userInfoText: style({\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }),\n userInfoName: style({\n fontWeight: 600,\n fontSize: 14,\n color: themeVars.text.core.default,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n userInfoEmail: style({\n fontSize: 13,\n color: themeVars.text.core.subtle,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n separator: style({\n height: 1,\n margin: `${themeVars.space[200]} 0`,\n backgroundColor: themeVars.border.core.subtle.default,\n border: 'none',\n }),\n disconnectItem: style({\n display: 'flex',\n alignItems: 'center',\n gap: themeVars.space[200],\n padding: `${themeVars.space[200]} ${themeVars.space[300]}`,\n color: themeVars.text.alert.default,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n outline: 'none',\n userSelect: 'none',\n selectors: {\n '&[data-highlighted]': {\n backgroundColor: themeVars.fill.accent.red.subtle.default,\n },\n },\n }),\n disconnectIcon: style({\n width: 16,\n height: 16,\n }),\n} as const;\n","import { Menu } from '@base-ui/react/menu';\n\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { ConnectButton } from '../ConnectButton/ConnectButton.tsx';\nimport { ChevronDownIcon } from '../icons/ChevronDownIcon.tsx';\nimport { ExternalLinkIcon } from '../icons/ExternalLinkIcon.tsx';\nimport { HubSpotDataSourceIcon } from '../icons/HubSpotDataSourceIcon.tsx';\nimport { LogoutIcon } from '../icons/LogoutIcon.tsx';\nimport { ShareButton } from '../ShareButton/ShareButton.tsx';\nimport { styles } from './AppConnectHeader.css.ts';\n\ninterface FakeUser {\n firstName: string;\n lastName: string;\n email: string;\n}\n\nconst FAKE_USER: FakeUser = {\n firstName: 'Gabby',\n lastName: 'Martinez',\n email: 'gabby.martinez@acmecorp.com',\n};\n\nfunction getUserInitials(user: FakeUser): string {\n const first = user.firstName.charAt(0).toUpperCase();\n const last = user.lastName.charAt(0).toUpperCase();\n return `${first}${last}`;\n}\n\nfunction getFullName(user: FakeUser): string {\n return `${user.firstName} ${user.lastName}`;\n}\n\ninterface AppConnectHeaderProps {\n title: string;\n}\n\nexport function AppConnectHeader({ title }: AppConnectHeaderProps) {\n const { status } = useHubSpotAppConnect();\n return (\n <header className={styles.header}>\n <div className={styles.titleRow}>\n <div className={styles.leftStack}>\n <div className={styles.titleCluster}>\n <h1 className={styles.title}>{title}</h1>\n <ShareButton pageTitle={title} />\n </div>\n {status === 'connected' ? <ViewingHubSpotContextRow /> : null}\n </div>\n </div>\n {status === 'connected' ? (\n <UserMenu />\n ) : (\n <ConnectButton variant=\"secondary\" />\n )}\n </header>\n );\n}\n\nfunction ViewingHubSpotContextRow() {\n return (\n <div className={styles.contextRow}>\n <HubSpotDataSourceIcon className={styles.contextIcon} />\n <span className={styles.contextPrefix}>Viewing HubSpot data from </span>\n <a\n className={styles.contextLink}\n href=\"#\"\n onClick={(event) => {\n event.preventDefault();\n }}\n >\n Acme Corp · HubSpot\n <ExternalLinkIcon className={styles.contextExternalIcon} />\n </a>\n </div>\n );\n}\n\nfunction UserMenu() {\n const { disconnectFromHubSpot } = useHubSpotAppConnect();\n const initials = getUserInitials(FAKE_USER);\n const fullName = getFullName(FAKE_USER);\n\n return (\n <Menu.Root modal={false}>\n <Menu.Trigger className={styles.userTrigger}>\n <span\n className={`${styles.avatar} ${styles.avatarSm}`}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <span className={styles.triggerName}>{fullName}</span>\n <ChevronDownIcon className={styles.chevron} />\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Positioner sideOffset={8} align=\"end\">\n <Menu.Popup className={styles.popup}>\n <div className={styles.userInfo}>\n <span\n className={`${styles.avatar} ${styles.avatarLg}`}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <div className={styles.userInfoText}>\n <span className={styles.userInfoName}>{fullName}</span>\n <span className={styles.userInfoEmail}>{FAKE_USER.email}</span>\n </div>\n </div>\n <Menu.Separator className={styles.separator} />\n <Menu.Item\n className={styles.disconnectItem}\n onClick={() => void disconnectFromHubSpot()}\n >\n <LogoutIcon className={styles.disconnectIcon} />\n Disconnect\n </Menu.Item>\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const styles = {\n card: style({\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.default,\n borderRadius: themeVars.borderRadius[400],\n padding: themeVars.space[500],\n textAlign: 'center',\n backgroundColor: themeVars.fill.surface.default.default,\n color: themeVars.text.core.default,\n }),\n message: style({\n marginTop: 0,\n marginBottom: themeVars.space[400],\n }),\n errorText: style({\n marginTop: themeVars.space[300],\n marginBottom: 0,\n color: themeVars.text.alert.default,\n }),\n} as const;\n","import type { ReactNode } from 'react';\n\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { ConnectButton } from '../ConnectButton/ConnectButton.tsx';\nimport { styles } from './DisconnectedBody.css.ts';\n\ninterface DisconnectedBodyProps {\n message: ReactNode;\n}\n\nexport function DisconnectedBody({ message }: DisconnectedBodyProps) {\n const { error } = useHubSpotAppConnect();\n\n return (\n <div className={styles.card}>\n <p className={styles.message}>{message}</p>\n <ConnectButton size=\"lg\" />\n {error && (\n <p className={styles.errorText}>\n Failed to connect to HubSpot. {error}\n </p>\n )}\n </div>\n );\n}\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nconst spin = keyframes({\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const styles = {\n wrapper: style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n padding: themeVars.space[600],\n }),\n spinner: style({\n width: 40,\n height: 40,\n borderWidth: 3,\n borderStyle: 'solid',\n borderColor: themeVars.border.core.subtle.default,\n borderTopColor: themeVars.fill.primary.default,\n borderRadius: '50%',\n animation: `${spin} 0.8s linear infinite`,\n }),\n} as const;\n","import { styles } from './LoadingIndicator.css.ts';\n\nexport function LoadingIndicator() {\n return (\n <div className={styles.wrapper} role=\"status\" aria-label=\"Loading\">\n <div className={styles.spinner} />\n </div>\n );\n}\n","import { style } from '@vanilla-extract/css';\n\nimport { themeVars } from '../../../theme.css.ts';\n\nexport const styles = {\n shell: style({\n width: '100%',\n padding: `${themeVars.space[400]} ${themeVars.space[500]}`,\n }),\n content: style({\n marginTop: themeVars.space[500],\n }),\n connectedErrorBanner: style({\n backgroundColor: themeVars.fill.alert.subtle,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: themeVars.border.alert.default,\n borderRadius: themeVars.borderRadius[300],\n padding: themeVars.space[300],\n marginBottom: themeVars.space[300],\n color: themeVars.text.alert.default,\n }),\n} as const;\n","import { useEffect, type ReactNode } from 'react';\n\nimport { themeClass } from '../../../theme.css.ts';\nimport type { AppConnectController } from '../../../types.ts';\nimport { HubSpotAppConnectControllerContext } from '../../context.ts';\nimport { useHubSpotAppConnect } from '../../hooks.ts';\nimport { AppConnectHeader } from '../AppConnectHeader/AppConnectHeader.tsx';\nimport { DisconnectedBody } from '../DisconnectedBody/DisconnectedBody.tsx';\nimport { LoadingIndicator } from '../LoadingIndicator/LoadingIndicator.tsx';\nimport { styles } from './HubSpotAppConnect.css.ts';\n\n/**\n * Props accepted by {@link HubSpotAppConnect}.\n */\nexport interface HubSpotAppConnectProps {\n /** Title text rendered in the standard SDK header. */\n title: string;\n /** Controller produced by `createAppConnectController`. */\n controller: AppConnectController;\n /** Content rendered when the controller is in the `connected` state. */\n connected: ReactNode;\n /**\n * Description text rendered inside the SDK-owned disconnected card,\n * above the primary \"Connect to HubSpot\" button.\n */\n disconnectedMessage: ReactNode;\n}\n\n/**\n * Layout component that exposes `controller` to {@link useHubSpotAppConnect},\n * starts it once on mount, and renders a standard header plus the content\n * slot that matches the current connection status.\n */\nexport function HubSpotAppConnect({\n title,\n controller,\n connected,\n disconnectedMessage,\n}: HubSpotAppConnectProps) {\n useEffect(() => {\n controller.start();\n }, [controller]);\n useEffect(() => {\n document.documentElement.classList.add(themeClass);\n return () => {\n document.documentElement.classList.remove(themeClass);\n };\n }, []);\n return (\n <HubSpotAppConnectControllerContext.Provider value={controller}>\n <div className={styles.shell}>\n <AppConnectHeader title={title} />\n <div className={styles.content}>\n <HubSpotAppConnectContent\n connected={connected}\n disconnectedMessage={disconnectedMessage}\n />\n </div>\n </div>\n </HubSpotAppConnectControllerContext.Provider>\n );\n}\n\ninterface HubSpotAppConnectContentProps {\n connected: ReactNode;\n disconnectedMessage: ReactNode;\n}\n\nfunction HubSpotAppConnectContent({\n connected,\n disconnectedMessage,\n}: HubSpotAppConnectContentProps) {\n const { status, error } = useHubSpotAppConnect();\n if (status === 'initializing') {\n return <LoadingIndicator />;\n }\n if (status === 'connected') {\n return (\n <>\n {error ? (\n <div className={styles.connectedErrorBanner} role=\"alert\">\n {error}\n </div>\n ) : null}\n {connected}\n </>\n );\n }\n return <DisconnectedBody message={disconnectedMessage} />;\n}\n"],"mappings":"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"}
|