woodsportal-client-sdk 4.0.7-dev.9 → 4.0.8-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +26 -0
  2. package/dist/adapters/angular/index.js +7 -5
  3. package/dist/adapters/angular/index.js.map +1 -1
  4. package/dist/adapters/native/index.d.ts +3 -0
  5. package/dist/adapters/native/index.js +11 -0
  6. package/dist/adapters/native/index.js.map +1 -0
  7. package/dist/adapters/react/index.d.ts +1 -1
  8. package/dist/adapters/react/index.js +8 -18
  9. package/dist/adapters/react/index.js.map +1 -1
  10. package/dist/adapters/vue/index.js +7 -5
  11. package/dist/adapters/vue/index.js.map +1 -1
  12. package/dist/auth-interceptor-policy-RGQ26NWR.js +6 -0
  13. package/dist/{auth-interceptor-policy-CKXBTGBT.js.map → auth-interceptor-policy-RGQ26NWR.js.map} +1 -1
  14. package/dist/auth-utils-T4FIBK3O.js +7 -0
  15. package/dist/{auth-utils-LT4JXJER.js.map → auth-utils-T4FIBK3O.js.map} +1 -1
  16. package/dist/{http-errors-CCCQECil.d.ts → build-error-description-DUXvNW7O.d.ts} +57 -6
  17. package/dist/{chunk-GKSO3757.js → chunk-5LISZE2R.js} +10 -6
  18. package/dist/chunk-5LISZE2R.js.map +1 -0
  19. package/dist/{chunk-Q7Y4HMVO.js → chunk-AVMMEQLO.js} +3 -3
  20. package/dist/{chunk-Q7Y4HMVO.js.map → chunk-AVMMEQLO.js.map} +1 -1
  21. package/dist/{chunk-WDCI5FXV.js → chunk-C73AH5CW.js} +173 -102
  22. package/dist/chunk-C73AH5CW.js.map +1 -0
  23. package/dist/chunk-DB6W3CJT.js +73 -0
  24. package/dist/chunk-DB6W3CJT.js.map +1 -0
  25. package/dist/{chunk-7AAQISX7.js → chunk-ETYE73AH.js} +35 -8
  26. package/dist/chunk-ETYE73AH.js.map +1 -0
  27. package/dist/{chunk-PRGN3FF6.js → chunk-JG3TEXWP.js} +7 -11
  28. package/dist/chunk-JG3TEXWP.js.map +1 -0
  29. package/dist/{chunk-6XIX6R4X.js → chunk-KPHAQNS2.js} +50 -5
  30. package/dist/chunk-KPHAQNS2.js.map +1 -0
  31. package/dist/{chunk-5NONTYJA.js → chunk-NDDE6ZZ3.js} +272 -86
  32. package/dist/chunk-NDDE6ZZ3.js.map +1 -0
  33. package/dist/{chunk-N7TNFXKZ.js → chunk-QXUSO7MR.js} +15 -9
  34. package/dist/chunk-QXUSO7MR.js.map +1 -0
  35. package/dist/{chunk-3YGYCBUT.js → chunk-VN6VPM5C.js} +4 -4
  36. package/dist/{chunk-3YGYCBUT.js.map → chunk-VN6VPM5C.js.map} +1 -1
  37. package/dist/chunk-YJOQG7DQ.js +1272 -0
  38. package/dist/chunk-YJOQG7DQ.js.map +1 -0
  39. package/dist/chunk-ZEGKRQA4.js +16 -0
  40. package/dist/chunk-ZEGKRQA4.js.map +1 -0
  41. package/dist/cross-tab-session-B34BLQU4.js +11 -0
  42. package/dist/{cross-tab-session-2HVBZQD3.js.map → cross-tab-session-B34BLQU4.js.map} +1 -1
  43. package/dist/entries/auth.d.ts +4 -3
  44. package/dist/entries/auth.js +9 -8
  45. package/dist/entries/auth.js.map +1 -1
  46. package/dist/entries/crm.d.ts +3 -3
  47. package/dist/entries/crm.js +10 -9
  48. package/dist/entries/crm.js.map +1 -1
  49. package/dist/{index-Bh9eY8sA.d.ts → index-DhoGEpj3.d.ts} +9 -1
  50. package/dist/index.d.ts +44 -7
  51. package/dist/index.js +70 -17
  52. package/dist/index.js.map +1 -1
  53. package/dist/{pipeline-ui-DbEzI_v1.d.ts → pipeline-ui-Bdrqupf0.d.ts} +2 -2
  54. package/dist/storage-migration-2PF52ZSB.js +4 -0
  55. package/dist/{storage-migration-2NVJ3GNQ.js.map → storage-migration-2PF52ZSB.js.map} +1 -1
  56. package/package.json +6 -1
  57. package/dist/auth-interceptor-policy-CKXBTGBT.js +0 -5
  58. package/dist/auth-utils-LT4JXJER.js +0 -5
  59. package/dist/chunk-5NONTYJA.js.map +0 -1
  60. package/dist/chunk-6XIX6R4X.js.map +0 -1
  61. package/dist/chunk-7AAQISX7.js.map +0 -1
  62. package/dist/chunk-GKSO3757.js.map +0 -1
  63. package/dist/chunk-N7TNFXKZ.js.map +0 -1
  64. package/dist/chunk-PRGN3FF6.js.map +0 -1
  65. package/dist/chunk-WDCI5FXV.js.map +0 -1
  66. package/dist/chunk-YKYHYW5F.js +0 -737
  67. package/dist/chunk-YKYHYW5F.js.map +0 -1
  68. package/dist/cross-tab-session-2HVBZQD3.js +0 -9
  69. package/dist/storage-migration-2NVJ3GNQ.js +0 -4
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { T as TableUiState, a as TableState, U as UserState, N as NoteState, E as EmailState, S as SyncState } from './use-sync-DpazhM4d.js';
2
- import { l as list, a as list$1, b as list$2, s as sideBarList, f as form, o as objectFormOptions, d as details, u as update, c as create, e as createExisting, r as removeExisting, g as list$3, h as create$1, i as update$1, j as list$4, k as create$2, m as update$2, n as list$5, p as details$1, q as download, t as addFolder, v as addFile, w as imageUpload, x as attachmentUpload, y as purge, z as purgeStatus, C as CachePurgeTarget, A as CachePurgeRequest, B as CachePurgeListQuery, D as CachePurgeView, E as CreateCachePurgeJobOptions, P as PurgeResult, F as CrmCachePurgeOptions } from './pipeline-ui-DbEzI_v1.js';
3
- export { G as CachePurgeDomain, H as CachePurgeMode, I as HUBSPOT_DEALS_OBJECT_TYPE_ID, J as HUBSPOT_TICKETS_OBJECT_TYPE_ID, K as PIPELINE_BOARD_OBJECT_TYPE_IDS, L as PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS, M as isPipelineBoardObjectType, N as isPipelineBoardObjectTypeId, O as shouldShowPipelineSelector, Q as supportsBoardView } from './pipeline-ui-DbEzI_v1.js';
4
- import { p as preLogin, l as login, c as clientSession, h as handoff, a as logout, r as register, v as verifyEmail, b as registerExistingUser, f as forgetPassword, d as resetPassword, e as resetPasswordVerifyToken, g as verifyEmailResend, i as resendEmail, j as changePassword, m as me, k as profile, n as profileUpdate, o as verifyOtp, s as sendMfaOtp, q as pendingPasskeyOptions, t as pendingPasskeyVerify, u as getMfaStatus, w as setMfaPreferences, x as startPhoneVerify, y as confirmPhoneVerify, z as totpEnrollStart, A as totpEnrollVerify, B as totpDisable, C as phoneUnverify, D as backupCodesRegenerate, E as mfaOptOut, F as webauthnRegisterOptions, G as webauthnRegisterVerify, H as webauthnAuthOptions, I as webauthnAuthVerify, J as listWebauthnCredentials, K as deleteWebauthnCredential, L as passkeyLoginOptions, M as passkeyLoginVerify, N as getSecurityOverview, O as getSecurityLoginActivity, P as getSecuritySessions, Q as revokeSecuritySession, R as revokeOtherSecuritySessions, S as getLoginBootstrap, T as getSsoDetails, U as generateSsoUrl, V as ssoCallback, W as getRefreshToken, X as refreshSession, Y as getAuthRefreshToken, Z as getAccessToken, _ as setAccessToken, $ as clearAccessToken, a0 as isAuthenticated, a1 as isAuthenticateApp, a2 as isAccessTokenExpired, a3 as isExpiresAccessToken, a4 as hasRefreshSession, a5 as hasValidAccessToken, a6 as didLastRefreshFail, a7 as isSessionRefreshExhausted, a8 as isRefreshInFlight, a9 as resetSessionAuthState, aa as clearSessionRefreshExhaustedState, ab as hydrateSessionRefreshState, ac as SessionContractInput, ad as LoggerConfig, ae as TwoFaVerificationRequest, af as MfaOtpSendRequest, ag as MfaPendingPasskeyOptionsRequest, ah as MfaPendingPasskeyVerifyRequest, ai as MfaStatusQuery, aj as MfaPreferenceRequest, ak as PhoneVerifyStartRequest, al as PhoneVerifyConfirmRequest, am as TotpEnrollVerifyRequest, an as TotpDisableRequest, ao as PhoneUnverifyRequest, ap as BackupCodesRegenerateRequest, aq as MfaBackupCodesResponse, ar as MfaOptOutRequest, as as WebAuthnVerifyRequest, at as PasskeyLoginOptionsRequest, au as PasskeyLoginVerifyRequest, av as SecurityOverviewQuery, aw as SecurityLoginActivityQuery, ax as SecuritySessionsQuery, ay as RevokeSecuritySessionPayload } from './http-errors-CCCQECil.js';
5
- export { az as ActiveSession, aA as ApiErrorPayload, aB as AuthErrorAction, aC as AuthErrorCode, aD as AuthErrorCodeValue, aE as AuthFunnelState, aF as AuthInterceptorPolicyConfig, aG as AuthPolicyRoutes, aH as AuthRouteAction, aI as HttpClientConfig, aJ as HttpErrorKind, aK as HydrateMfaPendingAccessTokenInput, aL as LogLevel, aM as LoginHistoryRow, aN as LoginResponseData, aO as MfaBootRecoveryResult, aP as MfaEnrollmentStatus, aQ as MfaMethod, aR as MfaMethodOption, aS as MfaPendingAccessToken, aT as MfaPortalScopeContext, aU as MfaStorageLane, aV as PaginationResponse, aW as SERVICE_UNAVAILABLE_MESSAGE, aX as SecurityOverview, aY as StorageKeyConfig, aZ as StoredAuthError, a_ as UnauthorizedPageCopy, a$ as WoodsportalRequestConfig, b0 as classifyHttpError, b1 as clearMfaPendingAccessToken, b2 as configureStorageKeys, b3 as getFieldErrors, b4 as getFormErrors, b5 as getHttpErrorMessage, b6 as getStorageKeys, b7 as getUnauthorizedPageCopy, b8 as hasAuthenticatedAccess, b9 as hasValidAccess, ba as hydrateMfaPendingAccessToken, bb as initializeHttpClient, bc as isFullyAuthenticated, bd as isMfaPendingAccessSession, be as isMfaPendingSession, bf as isOptionalAuthFailureUrl, bg as isServiceUnavailableError, bh as isSessionProbeUrl, bi as parseApiErrorPayload, bj as persistAuthError, bk as readMfaPendingAccessToken, bl as readPersistedAuthError, bm as recoverMfaGateOnBoot, bn as resetStorageKeysForTests, bo as resolveAuthErrorAction, bp as resolveAuthRouteAction, bq as setSessionLifecycleListener, br as startVisibilityRefreshScheduler, bs as stopVisibilityRefreshScheduler, bt as storeMfaPendingAccessToken } from './http-errors-CCCQECil.js';
6
- import { P as PreLoginPayload, L as LoginPayload, V as VerifyEmailPayload, R as ResetPasswordVerifyTokenPayload, a as ResetPasswordPayload, F as ForgetPasswordPayload, C as ChangePasswordPayload } from './index-Bh9eY8sA.js';
7
- export { b as Config, M as MutationOptions } from './index-Bh9eY8sA.js';
2
+ import { l as list, a as list$1, b as list$2, s as sideBarList, f as form, o as objectFormOptions, d as details, u as update, c as create, e as createExisting, r as removeExisting, g as list$3, h as create$1, i as update$1, j as list$4, k as create$2, m as update$2, n as list$5, p as details$1, q as download, t as addFolder, v as addFile, w as imageUpload, x as attachmentUpload, y as purge, z as purgeStatus, E as CachePurgeTarget, D as CachePurgeRequest, A as CachePurgeListQuery, F as CachePurgeView, G as CreateCachePurgeJobOptions, L as PurgeResult, H as CrmCachePurgeOptions } from './pipeline-ui-Bdrqupf0.js';
3
+ export { C as CachePurgeDomain, B as CachePurgeMode, I as HUBSPOT_DEALS_OBJECT_TYPE_ID, J as HUBSPOT_TICKETS_OBJECT_TYPE_ID, P as PIPELINE_BOARD_OBJECT_TYPE_IDS, K as PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS, M as isPipelineBoardObjectType, N as isPipelineBoardObjectTypeId, O as shouldShowPipelineSelector, Q as supportsBoardView } from './pipeline-ui-Bdrqupf0.js';
4
+ import { p as preLogin, l as login, c as clientSession, h as handoff, a as logout, r as register, v as verifyEmail, b as registerExistingUser, f as forgetPassword, d as verifyForgotPasswordOtp, e as resetPassword, g as resetPasswordVerifyToken, i as verifyEmailResend, j as resendEmail, k as changePassword, m as me, n as profile, o as profileUpdate, q as verifyOtp, s as sendMfaOtp, t as pendingPasskeyOptions, u as pendingPasskeyVerify, w as getMfaStatus, x as setMfaPreferences, y as startPhoneVerify, z as confirmPhoneVerify, A as totpEnrollStart, B as totpEnrollVerify, C as totpDisable, D as phoneUnverify, E as backupCodesRegenerate, F as mfaOptOut, G as webauthnRegisterOptions, H as webauthnRegisterVerify, I as webauthnAuthOptions, J as webauthnAuthVerify, K as listWebauthnCredentials, L as deleteWebauthnCredential, M as passkeyLoginOptions, N as passkeyLoginVerify, O as getSecurityOverview, P as getSecurityLoginActivity, Q as getSecuritySessions, R as revokeSecuritySession, S as revokeOtherSecuritySessions, T as getLoginBootstrap, U as getSsoDetails, V as generateSsoUrl, W as ssoCallback, X as getRefreshToken, Y as refreshSession, Z as getAuthRefreshToken, _ as getAccessToken, $ as setAccessToken, a0 as clearAccessToken, a1 as isAuthenticated, a2 as isAuthenticateApp, a3 as isAccessTokenExpired, a4 as isExpiresAccessToken, a5 as hasRefreshSession, a6 as hasValidAccessToken, a7 as didLastRefreshFail, a8 as isSessionRefreshExhausted, a9 as isRefreshInFlight, aa as resetSessionAuthState, ab as clearSessionRefreshExhaustedState, ac as hydrateSessionRefreshState, ad as SessionContractInput, at as HttpClientConfig, aL as ResolvedApiErrorDisplay, bm as ApiContentVariant, bn as ApiErrorSeverity, aK as ResolveApiErrorDisplayOptions, bo as LoggerConfig, aP as TwoFaVerificationRequest, bp as MfaOtpSendRequest, bq as MfaPendingPasskeyOptionsRequest, br as MfaPendingPasskeyVerifyRequest, bs as MfaStatusQuery, bt as MfaPreferenceRequest, bu as PhoneVerifyStartRequest, bv as PhoneVerifyConfirmRequest, bw as TotpEnrollVerifyRequest, bx as TotpDisableRequest, by as PhoneUnverifyRequest, bz as BackupCodesRegenerateRequest, bA as MfaBackupCodesResponse, bB as MfaOptOutRequest, bC as WebAuthnVerifyRequest, bD as PasskeyLoginOptionsRequest, bE as PasskeyLoginVerifyRequest, bF as SecurityOverviewQuery, bG as SecurityLoginActivityQuery, bH as SecuritySessionsQuery, bI as RevokeSecuritySessionPayload } from './build-error-description-DUXvNW7O.js';
5
+ export { ae as API_ERROR_CATEGORY_FALLBACK, af as API_ERROR_DISPLAY_CONFIG, ag as ActiveSession, ah as ApiErrorDisplayConfig, ai as ApiErrorPayload, aj as ApiErrorVariant, ak as AuthErrorAction, al as AuthErrorCode, am as AuthErrorCodeValue, an as AuthFunnelState, ao as AuthInterceptorPolicyConfig, ap as AuthPolicyRoutes, aq as AuthRouteAction, au as HttpErrorKind, av as HydrateMfaPendingAccessTokenInput, bJ as LogLevel, aA as LoginHistoryRow, aB as LoginResponseData, aC as MfaBootRecoveryResult, aD as MfaEnrollmentStatus, aE as MfaMethod, aF as MfaMethodOption, aG as MfaPendingAccessToken, aH as MfaPortalScopeContext, aI as MfaStorageLane, aJ as PaginationResponse, aM as SERVICE_UNAVAILABLE_MESSAGE, aN as SecurityOverview, bK as StorageKeyConfig, aO as StoredAuthError, aQ as UnauthorizedPageCopy, aR as WOODSPORTAL_API_ACTIVE_ERROR_CODES, aS as WoodsportalRequestConfig, aT as buildErrorDescription, aU as classifyHttpError, aV as clearMfaPendingAccessToken, bL as configureStorageKeys, aW as getApiErrorFromUnknown, aX as getFieldErrors, aY as getFormErrors, aZ as getHttpErrorMessage, bM as getStorageKeys, a_ as getUnauthorizedPageCopy, a$ as hasAuthenticatedAccess, b0 as hasValidAccess, b1 as hydrateMfaPendingAccessToken, b2 as initializeHttpClient, b3 as isFullyAuthenticated, b4 as isMfaPendingAccessSession, b5 as isMfaPendingSession, b6 as isOptionalAuthFailureUrl, b7 as isServiceUnavailableError, b8 as isSessionProbeUrl, b9 as parseApiErrorPayload, ba as persistAuthError, bb as readMfaPendingAccessToken, bc as readPersistedAuthError, bd as recoverMfaGateOnBoot, bN as resetStorageKeysForTests, be as resolveApiErrorDisplay, bf as resolveAuthErrorAction, bg as resolveAuthRouteAction, bi as setSessionLifecycleListener, bj as startVisibilityRefreshScheduler, bk as stopVisibilityRefreshScheduler, bl as storeMfaPendingAccessToken } from './build-error-description-DUXvNW7O.js';
6
+ import { P as PreLoginPayload, L as LoginPayload, V as VerifyEmailPayload, a as ResetPasswordVerifyTokenPayload, R as ResetPasswordPayload, F as ForgetPasswordPayload, b as ForgetPasswordOtpVerifyPayload, C as ChangePasswordPayload } from './index-DhoGEpj3.js';
7
+ export { c as Config, M as MutationOptions } from './index-DhoGEpj3.js';
8
8
  import 'axios';
9
9
 
10
10
  declare const WP_UI_THEME = "wp.ui.theme";
@@ -130,6 +130,7 @@ declare const api: {
130
130
  verifyEmail: typeof verifyEmail;
131
131
  registerExistingUser: typeof registerExistingUser;
132
132
  forgetPassword: typeof forgetPassword;
133
+ verifyForgotPasswordOtp: typeof verifyForgotPasswordOtp;
133
134
  resetPassword: typeof resetPassword;
134
135
  resetPasswordVerifyToken: typeof resetPasswordVerifyToken;
135
136
  verifyEmailResend: typeof verifyEmailResend;
@@ -286,6 +287,16 @@ declare const api: {
286
287
  };
287
288
  };
288
289
  };
290
+ accounts: {
291
+ listHubspots: () => Promise<unknown>;
292
+ listPortals: (hubId: number) => Promise<unknown>;
293
+ };
294
+ mobile: {
295
+ getNavigation: () => Promise<unknown>;
296
+ getAppConfig: () => Promise<unknown>;
297
+ putNavigation: (payload: unknown) => Promise<unknown>;
298
+ importFromWebMenu: (payload: unknown) => Promise<unknown>;
299
+ };
289
300
  };
290
301
 
291
302
  declare const DEFAULT_HUBSPOT_TIMEZONE = "Asia/Kolkata";
@@ -359,6 +370,31 @@ type ResolveCrmListPurgeQueryOptions = {
359
370
  };
360
371
  declare function resolveCrmListPurgeQuery(options: ResolveCrmListPurgeQueryOptions): CachePurgeListQuery;
361
372
 
373
+ interface SessionStorageAdapter {
374
+ getRefreshToken(): string | null;
375
+ setRefreshToken(token: string, expiresAtMs: number): void | Promise<void>;
376
+ removeRefreshToken(): void;
377
+ getItem(key: string): string | null;
378
+ setItem(key: string, value: string): void;
379
+ removeItem(key: string): void;
380
+ }
381
+
382
+ type MobileClientConfig = HttpClientConfig & {
383
+ storage: SessionStorageAdapter;
384
+ };
385
+ declare function initializeMobileClient({ storage, ...httpConfig }: MobileClientConfig): void;
386
+
387
+ type SdkClientType = 'web' | 'mobile';
388
+ declare function getClientType(): SdkClientType;
389
+
390
+ type ResolvedApiContentState = ResolvedApiErrorDisplay & {
391
+ contentVariant: ApiContentVariant;
392
+ severity: ApiErrorSeverity;
393
+ isExpected: boolean;
394
+ };
395
+ declare function resolveApiContentState(error: unknown, options?: ResolveApiErrorDisplayOptions): ResolvedApiContentState;
396
+ declare function isExpectedApiError(error: unknown): boolean;
397
+
362
398
  declare function configureLogger(config?: LoggerConfig): void;
363
399
 
364
400
  declare const Client: {
@@ -448,6 +484,7 @@ declare const Client: {
448
484
  resetPasswordVerifyToken: (data: ResetPasswordVerifyTokenPayload) => Promise<unknown>;
449
485
  resetPassword: (data: ResetPasswordPayload) => Promise<unknown>;
450
486
  forgetPassword: (data: ForgetPasswordPayload) => Promise<unknown>;
487
+ verifyForgotPasswordOtp: (data: ForgetPasswordOtpVerifyPayload) => Promise<unknown>;
451
488
  registerExistingUser: (data: any) => Promise<unknown>;
452
489
  verifyEmailResend: (data: any) => Promise<unknown>;
453
490
  resendEmail: (data: any) => Promise<unknown>;
@@ -631,4 +668,4 @@ declare const store: {
631
668
  };
632
669
  };
633
670
 
634
- export { CachePurgeListQuery, CachePurgeRequest, CachePurgeTarget, CachePurgeView, ChangePasswordPayload, Client, CreateCachePurgeJobOptions, CrmCachePurgeOptions, DEFAULT_HUBSPOT_TIMEZONE, ForgetPasswordPayload, type HubSpotActivityDateTimeParts, LoggerConfig, LoginPayload, PreLoginPayload, PurgeResult, ResetPasswordPayload, ResetPasswordVerifyTokenPayload, SessionContractInput, TwoFaVerificationRequest, VerifyEmailPayload, WP_STORAGE_KEYS, WP_UI_THEME, api, applyCrossTabSessionRevocation, buildCachePurgeRequest, buildCrmListPurgeTarget, buildCrmSinglePurgeTarget, buildEngagementPurgeTarget, buildPortalConfigPurgeTarget, buildUserSessionPurgeTarget, clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSdkSession, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureLogger, createCachePurgeJob, extractEngagementItemIdFromWriteResponse, extractHubspotRecordIdFromWriteResponse, formatGmtOffset, formatHubSpotActivityDateTime, formatHubSpotActivityDateTimeParts, getClientAuthCookieNamesToClear, getCurrentTimeZone, config as hubContext, installCrossTabSessionListener, mergePurgeTargets, migrateLegacyStorageKeys, normalizeToTimestamp, purgeCrmCombined, purgeCrmDetailAndListAfterCrmWrite, purgeCrmListCache, purgeCrmListCacheAfterCrmWrite, purgeCrmObjectDataCache, purgeCrmRecordCache, purgeEngagementCaches, purgeEngagementCachesAfterCrmWrite, resetSessionStores, resolveCrmListPurgeQuery, setConfig as setHubContext, signalSessionChanged, store, toCachePurgeListQuery, wpClientIframeRefreshExpKey, wpClientIframeRefreshKey };
671
+ export { ApiContentVariant, ApiErrorSeverity, CachePurgeListQuery, CachePurgeRequest, CachePurgeTarget, CachePurgeView, ChangePasswordPayload, Client, CreateCachePurgeJobOptions, CrmCachePurgeOptions, DEFAULT_HUBSPOT_TIMEZONE, ForgetPasswordPayload, HttpClientConfig, type HubSpotActivityDateTimeParts, LoggerConfig, LoginPayload, type MobileClientConfig, PreLoginPayload, PurgeResult, ResetPasswordPayload, ResetPasswordVerifyTokenPayload, ResolveApiErrorDisplayOptions, type ResolvedApiContentState, ResolvedApiErrorDisplay, SessionContractInput, type SessionStorageAdapter, TwoFaVerificationRequest, VerifyEmailPayload, WP_STORAGE_KEYS, WP_UI_THEME, api, applyCrossTabSessionRevocation, buildCachePurgeRequest, buildCrmListPurgeTarget, buildCrmSinglePurgeTarget, buildEngagementPurgeTarget, buildPortalConfigPurgeTarget, buildUserSessionPurgeTarget, clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSdkSession, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureLogger, createCachePurgeJob, extractEngagementItemIdFromWriteResponse, extractHubspotRecordIdFromWriteResponse, formatGmtOffset, formatHubSpotActivityDateTime, formatHubSpotActivityDateTimeParts, getClientAuthCookieNamesToClear, getClientType, getCurrentTimeZone, config as hubContext, initializeMobileClient, installCrossTabSessionListener, isExpectedApiError, mergePurgeTargets, migrateLegacyStorageKeys, normalizeToTimestamp, purgeCrmCombined, purgeCrmDetailAndListAfterCrmWrite, purgeCrmListCache, purgeCrmListCacheAfterCrmWrite, purgeCrmObjectDataCache, purgeCrmRecordCache, purgeEngagementCaches, purgeEngagementCachesAfterCrmWrite, resetSessionStores, resolveApiContentState, resolveCrmListPurgeQuery, setConfig as setHubContext, signalSessionChanged, store, toCachePurgeListQuery, wpClientIframeRefreshExpKey, wpClientIframeRefreshKey };
package/dist/index.js CHANGED
@@ -1,26 +1,58 @@
1
- export { applyCrossTabSessionRevocation, clearClientSdkSession, installCrossTabSessionListener, resetSessionStores, signalSessionChanged } from './chunk-GKSO3757.js';
2
- import { authApi } from './chunk-YKYHYW5F.js';
3
- export { hasAuthenticatedAccess, hasValidAccess, isFullyAuthenticated, isMfaPendingSession, recoverMfaGateOnBoot, resolveAuthRouteAction } from './chunk-YKYHYW5F.js';
4
- export { isOptionalAuthFailureUrl, isSessionProbeUrl, persistAuthError, readPersistedAuthError, resolveAuthErrorAction } from './chunk-PRGN3FF6.js';
5
- import { crmApi } from './chunk-N7TNFXKZ.js';
6
- export { isPipelineBoardObjectType, shouldShowPipelineSelector, supportsBoardView } from './chunk-N7TNFXKZ.js';
1
+ export { applyCrossTabSessionRevocation, clearClientSdkSession, installCrossTabSessionListener, resetSessionStores, signalSessionChanged } from './chunk-5LISZE2R.js';
2
+ import { authApi } from './chunk-YJOQG7DQ.js';
3
+ export { API_ERROR_CATEGORY_FALLBACK, API_ERROR_DISPLAY_CONFIG, WOODSPORTAL_API_ACTIVE_ERROR_CODES, buildErrorDescription, getApiErrorFromUnknown, hasAuthenticatedAccess, hasValidAccess, isExpectedApiError, isFullyAuthenticated, isMfaPendingSession, recoverMfaGateOnBoot, resolveApiContentState, resolveApiErrorDisplay, resolveAuthRouteAction } from './chunk-YJOQG7DQ.js';
4
+ export { isOptionalAuthFailureUrl, isSessionProbeUrl, persistAuthError, readPersistedAuthError, resolveAuthErrorAction } from './chunk-JG3TEXWP.js';
5
+ import { crmApi } from './chunk-QXUSO7MR.js';
6
+ export { isPipelineBoardObjectType, shouldShowPipelineSelector, supportsBoardView } from './chunk-QXUSO7MR.js';
7
7
  import './chunk-55MIERLJ.js';
8
- import { navigationApi } from './chunk-WDCI5FXV.js';
9
- export { Client, SERVICE_UNAVAILABLE_MESSAGE, buildCachePurgeRequest, buildCrmListPurgeTarget, buildCrmSinglePurgeTarget, buildEngagementPurgeTarget, buildPortalConfigPurgeTarget, buildUserSessionPurgeTarget, classifyHttpError, createCachePurgeJob, extractEngagementItemIdFromWriteResponse, extractHubspotRecordIdFromWriteResponse, getFieldErrors, getFormErrors, getHttpErrorMessage, initializeHttpClient, isServiceUnavailableError, mergePurgeTargets, purgeCrmCombined, purgeCrmDetailAndListAfterCrmWrite, purgeCrmListCache, purgeCrmListCacheAfterCrmWrite, purgeCrmObjectDataCache, purgeCrmRecordCache, purgeEngagementCaches, purgeEngagementCachesAfterCrmWrite, resolveCrmListPurgeQuery, startVisibilityRefreshScheduler, stopVisibilityRefreshScheduler, toCachePurgeListQuery } from './chunk-WDCI5FXV.js';
10
- import './chunk-Q7Y4HMVO.js';
11
- import { actions8, syncStore, actions5, emailStore, actions4, noteStore, actions6, userStore, actions2, tableStore, tableUiActions, tableUiStore } from './chunk-7AAQISX7.js';
12
- export { HUBSPOT_DEALS_OBJECT_TYPE_ID, HUBSPOT_TICKETS_OBJECT_TYPE_ID, PIPELINE_BOARD_OBJECT_TYPE_IDS, PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS, isPipelineBoardObjectTypeId } from './chunk-7AAQISX7.js';
13
- import { storage } from './chunk-5NONTYJA.js';
14
- export { clearMfaPendingAccessToken, configureLogger, config as hubContext, hydrateMfaPendingAccessToken, isMfaPendingAccessSession, readMfaPendingAccessToken, setConfig as setHubContext, setSessionLifecycleListener, storeMfaPendingAccessToken } from './chunk-5NONTYJA.js';
15
- export { AuthErrorCode, getUnauthorizedPageCopy, parseApiErrorPayload } from './chunk-COHBSTHF.js';
16
- export { clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureStorageKeys, getClientAuthCookieNamesToClear, getStorageKeys, migrateLegacyStorageKeys, resetStorageKeysForTests } from './chunk-6XIX6R4X.js';
8
+ import { navigationApi, HttpClient, API_ENDPOINTS, generateApiUrl, initializeHttpClient } from './chunk-C73AH5CW.js';
9
+ export { Client, buildCachePurgeRequest, buildCrmListPurgeTarget, buildCrmSinglePurgeTarget, buildEngagementPurgeTarget, buildPortalConfigPurgeTarget, buildUserSessionPurgeTarget, createCachePurgeJob, extractEngagementItemIdFromWriteResponse, extractHubspotRecordIdFromWriteResponse, getFieldErrors, getFormErrors, initializeHttpClient, mergePurgeTargets, purgeCrmCombined, purgeCrmDetailAndListAfterCrmWrite, purgeCrmListCache, purgeCrmListCacheAfterCrmWrite, purgeCrmObjectDataCache, purgeCrmRecordCache, purgeEngagementCaches, purgeEngagementCachesAfterCrmWrite, resolveCrmListPurgeQuery, startVisibilityRefreshScheduler, stopVisibilityRefreshScheduler, toCachePurgeListQuery } from './chunk-C73AH5CW.js';
10
+ import './chunk-AVMMEQLO.js';
11
+ import { actions8, syncStore, actions5, emailStore, actions4, noteStore, actions6, userStore, actions2, tableStore, tableUiActions, tableUiStore, hydrateUserStoreFromSession } from './chunk-ETYE73AH.js';
12
+ export { HUBSPOT_DEALS_OBJECT_TYPE_ID, HUBSPOT_TICKETS_OBJECT_TYPE_ID, PIPELINE_BOARD_OBJECT_TYPE_IDS, PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS, isPipelineBoardObjectTypeId } from './chunk-ETYE73AH.js';
13
+ import { storage, hydrateSessionRefreshState, hydrateMfaPendingAccessToken, storAccessToken } from './chunk-NDDE6ZZ3.js';
14
+ export { SERVICE_UNAVAILABLE_MESSAGE, classifyHttpError, clearMfaPendingAccessToken, configureLogger, getHttpErrorMessage, config as hubContext, hydrateMfaPendingAccessToken, isMfaPendingAccessSession, isServiceUnavailableError, readMfaPendingAccessToken, setConfig as setHubContext, setSessionLifecycleListener, storeMfaPendingAccessToken } from './chunk-NDDE6ZZ3.js';
15
+ import { setClientType } from './chunk-KPHAQNS2.js';
16
+ export { clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureStorageKeys, getClientAuthCookieNamesToClear, getClientType, getStorageKeys, migrateLegacyStorageKeys, resetStorageKeysForTests } from './chunk-KPHAQNS2.js';
17
+ import { registerSessionStorageAdapter } from './chunk-DB6W3CJT.js';
17
18
  export { WP_STORAGE_KEYS, WP_UI_THEME, wpClientIframeRefreshExpKey, wpClientIframeRefreshKey } from './chunk-UDAPRD7Z.js';
19
+ export { AuthErrorCode, getUnauthorizedPageCopy, parseApiErrorPayload } from './chunk-COHBSTHF.js';
20
+
21
+ // src/main/features/accounts/client/accounts-client.ts
22
+ var accountsClient = {
23
+ listHubspots: () => HttpClient.get(API_ENDPOINTS.HUBSPOTS),
24
+ listPortals: (hubId) => HttpClient.get(API_ENDPOINTS.PORTALS, { hubId })
25
+ };
26
+
27
+ // src/main/api/nested-accounts-api.ts
28
+ var accountsApi = {
29
+ listHubspots: accountsClient.listHubspots,
30
+ listPortals: accountsClient.listPortals
31
+ };
32
+
33
+ // src/main/features/mobile/client/mobile-navigation-client.ts
34
+ var mobileNavigationClient = {
35
+ getNavigation: () => HttpClient.get(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION })),
36
+ getAppConfig: () => HttpClient.get(generateApiUrl({ route: API_ENDPOINTS.MOBILE_APP_CONFIG })),
37
+ putNavigation: (payload) => HttpClient.put(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION }), payload),
38
+ importFromWebMenu: (payload) => HttpClient.post(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION_IMPORT_WEB_MENU }), payload)
39
+ };
40
+
41
+ // src/main/api/nested-mobile-api.ts
42
+ var mobileApi = {
43
+ getNavigation: mobileNavigationClient.getNavigation,
44
+ getAppConfig: mobileNavigationClient.getAppConfig,
45
+ putNavigation: mobileNavigationClient.putNavigation,
46
+ importFromWebMenu: mobileNavigationClient.importFromWebMenu
47
+ };
18
48
 
19
49
  // src/main/api/compose-api.ts
20
50
  var api = {
21
51
  auth: authApi,
22
52
  crm: crmApi,
23
- navigation: navigationApi
53
+ navigation: navigationApi,
54
+ accounts: accountsApi,
55
+ mobile: mobileApi
24
56
  };
25
57
 
26
58
  // src/main/core/utils/datetime.ts
@@ -83,6 +115,27 @@ function formatHubSpotActivityDateTime(timestamp, timeZone = getCurrentTimeZone(
83
115
  return formatHubSpotActivityDateTimeParts(timestamp, timeZone)?.formatted ?? "";
84
116
  }
85
117
 
118
+ // src/main/core/http/mobile-client-config.ts
119
+ function initializeMobileClient({ storage: storage2, ...httpConfig }) {
120
+ registerSessionStorageAdapter(storage2);
121
+ setClientType("mobile");
122
+ hydrateSessionRefreshState();
123
+ void hydrateMfaPendingAccessToken({
124
+ lane: "c",
125
+ setAccessToken: (token, expiresIn) => {
126
+ storAccessToken(token, expiresIn);
127
+ }
128
+ });
129
+ hydrateUserStoreFromSession();
130
+ initializeHttpClient({
131
+ ...httpConfig,
132
+ headers: {
133
+ "X-Client-Type": "mobile",
134
+ ...httpConfig.headers
135
+ }
136
+ });
137
+ }
138
+
86
139
  // src/main/index.ts
87
140
  var store = {
88
141
  storage,
@@ -94,6 +147,6 @@ var store = {
94
147
  sync: { store: syncStore, actions: actions8 }
95
148
  };
96
149
 
97
- export { DEFAULT_HUBSPOT_TIMEZONE, api, formatGmtOffset, formatHubSpotActivityDateTime, formatHubSpotActivityDateTimeParts, getCurrentTimeZone, normalizeToTimestamp, store };
150
+ export { DEFAULT_HUBSPOT_TIMEZONE, api, formatGmtOffset, formatHubSpotActivityDateTime, formatHubSpotActivityDateTimeParts, getCurrentTimeZone, initializeMobileClient, normalizeToTimestamp, store };
98
151
  //# sourceMappingURL=index.js.map
99
152
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main/api/compose-api.ts","../src/main/core/utils/datetime.ts","../src/main/index.ts"],"names":["actions"],"mappings":"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","file":"index.js","sourcesContent":["import { authApi } from './nested-auth-api'\nimport { crmApi } from './nested-crm-api'\nimport { navigationApi } from './navigation-api'\n\n/** Public API — nested domains only (SDK 4.0). */\nexport const api = {\n auth: authApi,\n crm: crmApi,\n navigation: navigationApi\n}\n","/** HubSpot portal default; override when portal timezone is available from config. */\nexport const DEFAULT_HUBSPOT_TIMEZONE = 'Asia/Kolkata'\n\n/**\n * Detect the runtime/browser IANA timezone (e.g. `Asia/Kolkata`).\n * Falls back to the WoodsPortal default timezone when unavailable.\n */\nexport function getCurrentTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || DEFAULT_HUBSPOT_TIMEZONE\n } catch {\n return DEFAULT_HUBSPOT_TIMEZONE\n }\n}\n\n/**\n * Coerce HubSpot-style timestamps (ms string/number) to epoch milliseconds.\n */\nexport function normalizeToTimestamp(value: unknown): number | null {\n if (value == null || value === '') return null\n\n if (typeof value === 'number') {\n return value > 100_000_000_000 ? value : null\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value)) {\n const n = Number(value)\n return n > 100_000_000_000 ? n : null\n }\n\n if (typeof value === 'string' || value instanceof Date) {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date.getTime()\n }\n\n return null\n}\n\n/**\n * GMT offset label aligned with HubSpot activity timeline (e.g. `GMT+5:30`).\n */\nexport function formatGmtOffset(timeZone: string = getCurrentTimeZone(), date: Date = new Date()): string {\n const raw = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'longOffset'\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName')?.value\n\n if (!raw) return ''\n\n // Intl may emit GMT+05:30; HubSpot uses GMT+5:30.\n return raw.replace(/GMT([+-])0(\\d)(?=:)/, 'GMT$1$2')\n}\n\nexport type HubSpotActivityDateTimeParts = {\n date: string\n time: string\n gmtOffset: string\n /** Full HubSpot-style label, e.g. `May 27, 2026 at 11:31 PM GMT+5:30`. */\n formatted: string\n}\n\n/**\n * Format a HubSpot epoch-ms timestamp like the CRM activity timeline.\n */\nexport function formatHubSpotActivityDateTimeParts(timestamp: unknown, timeZone: string = getCurrentTimeZone()): HubSpotActivityDateTimeParts | null {\n const ms = normalizeToTimestamp(timestamp)\n if (ms == null) return null\n\n const date = new Date(ms)\n const datePart = new Intl.DateTimeFormat('en-US', {\n timeZone,\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n }).format(date)\n const timePart = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n }).format(date)\n const gmtOffset = formatGmtOffset(timeZone, date)\n\n return {\n date: datePart,\n time: timePart,\n gmtOffset,\n formatted: `${datePart} at ${timePart} ${gmtOffset}`.trim()\n }\n}\n\n/**\n * @returns HubSpot activity string, e.g. `May 27, 2026 at 11:31 PM GMT+5:30`, or empty string.\n */\nexport function formatHubSpotActivityDateTime(timestamp: unknown, timeZone: string = getCurrentTimeZone()): string {\n return formatHubSpotActivityDateTimeParts(timestamp, timeZone)?.formatted ?? ''\n}\n","/**\n * WoodsPortal client SDK — public entry module.\n *\n * Configure HTTP once with {@link initializeHttpClient} in production, then use\n * {@link api}, {@link store}, and {@link api.navigation}.\n */\nimport { api } from './api/compose-api'\nimport {\n tableStore,\n tableActions,\n tableUiStore,\n tableUiActions,\n userStore,\n userActions,\n noteStore,\n noteActions,\n emailStore,\n emailActions,\n syncStore,\n syncActions\n} from './state'\nimport { storage } from './core/utils/localStorage'\n\nexport {\n DEFAULT_HUBSPOT_TIMEZONE,\n getCurrentTimeZone,\n formatGmtOffset,\n formatHubSpotActivityDateTime,\n formatHubSpotActivityDateTimeParts,\n normalizeToTimestamp\n} from './core/utils/datetime'\nexport type { HubSpotActivityDateTimeParts } from './core/utils/datetime'\nexport {\n purgeCrmObjectDataCache,\n purgeCrmListCache,\n purgeCrmListCacheAfterCrmWrite,\n purgeCrmDetailAndListAfterCrmWrite,\n purgeCrmRecordCache,\n purgeEngagementCaches,\n purgeEngagementCachesAfterCrmWrite,\n purgeCrmCombined,\n buildCachePurgeRequest,\n buildCrmListPurgeTarget,\n buildCrmSinglePurgeTarget,\n buildEngagementPurgeTarget,\n buildPortalConfigPurgeTarget,\n buildUserSessionPurgeTarget,\n mergePurgeTargets,\n createCachePurgeJob,\n extractHubspotRecordIdFromWriteResponse,\n extractEngagementItemIdFromWriteResponse,\n resolveCrmListPurgeQuery,\n toCachePurgeListQuery\n} from './core/utils/cache'\nexport type { CrmCachePurgeOptions } from './core/types/cache-purge'\nexport type {\n CachePurgeRequest,\n CachePurgeTarget,\n CachePurgeListQuery,\n CachePurgeView,\n CachePurgeDomain,\n CachePurgeMode,\n PurgeResult,\n CreateCachePurgeJobOptions\n} from './core/types/cache-purge'\n\n/** Axios setup, error helpers, and {@link HttpClientConfig}. */\nexport { initializeHttpClient, getFormErrors, getFieldErrors } from './core/http/http-client'\nexport type { HttpClientConfig, StorageKeyConfig } from './core/http/http-client'\n\n/** Shared auth contract (client + admin consistency). */\nexport {\n AuthErrorCode,\n parseApiErrorPayload,\n getUnauthorizedPageCopy,\n resolveAuthErrorAction,\n isOptionalAuthFailureUrl,\n isSessionProbeUrl,\n persistAuthError,\n readPersistedAuthError,\n hasValidAccess,\n isFullyAuthenticated,\n isMfaPendingSession,\n hasAuthenticatedAccess,\n recoverMfaGateOnBoot,\n startVisibilityRefreshScheduler,\n stopVisibilityRefreshScheduler,\n resolveAuthRouteAction,\n storeMfaPendingAccessToken,\n readMfaPendingAccessToken,\n clearMfaPendingAccessToken,\n hydrateMfaPendingAccessToken,\n isMfaPendingAccessSession\n} from './core/auth/index.js'\nexport type {\n ApiErrorPayload,\n StoredAuthError,\n AuthErrorCodeValue,\n UnauthorizedPageCopy,\n AuthErrorAction,\n AuthPolicyRoutes,\n AuthInterceptorPolicyConfig,\n WoodsportalRequestConfig,\n SessionContractInput,\n MfaBootRecoveryResult,\n AuthRouteAction,\n AuthFunnelState,\n MfaStorageLane,\n MfaPendingAccessToken,\n HydrateMfaPendingAccessTokenInput\n} from './core/auth/index.js'\nexport { classifyHttpError, getHttpErrorMessage, isServiceUnavailableError, SERVICE_UNAVAILABLE_MESSAGE } from './core/http/http-errors'\nexport type { HttpErrorKind } from './core/http/http-errors'\n\nexport { configureLogger } from './core/logging/logger'\nexport type { LogLevel, LoggerConfig } from './core/logging/logger-types'\n\nexport { Client } from './core/http/client-assembler'\nexport { config as hubContext, setConfig as setHubContext } from './core/utils/hub-context'\n\nexport { WP_STORAGE_KEYS, WP_UI_THEME, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './core/utils/wp-storage-keys'\nexport {\n migrateLegacyStorageKeys,\n getClientAuthCookieNamesToClear,\n clearClientSessionStorageKeys,\n clearClientIframeRefreshLocalKeys,\n clearStaleIframeRefreshForOtherHubs\n} from './core/utils/storage-migration'\nexport { clearClientAuthCookies } from './core/utils/cookie'\nexport { clearClientSdkSession, resetSessionStores } from './core/http/session-teardown'\nexport { setSessionLifecycleListener } from './core/http/token-store'\nexport { signalSessionChanged, installCrossTabSessionListener, applyCrossTabSessionRevocation } from './core/http/cross-tab-session'\nexport { configureStorageKeys, getStorageKeys, resetStorageKeysForTests } from './core/utils/storage-keys'\n\nexport {\n HUBSPOT_DEALS_OBJECT_TYPE_ID,\n HUBSPOT_TICKETS_OBJECT_TYPE_ID,\n PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS,\n PIPELINE_BOARD_OBJECT_TYPE_IDS,\n isPipelineBoardObjectTypeId\n} from './core/constants/hubspot-object-type-ids'\nexport { isPipelineBoardObjectType, supportsBoardView, shouldShowPipelineSelector } from './core/constants/pipeline-ui'\n\nexport type {\n Config,\n MutationOptions,\n PreLoginPayload,\n LoginPayload,\n VerifyEmailPayload,\n ResetPasswordVerifyTokenPayload,\n ResetPasswordPayload,\n ForgetPasswordPayload,\n ChangePasswordPayload,\n MfaMethod,\n MfaMethodOption,\n MfaPortalScopeContext,\n LoginResponseData,\n TwoFaVerificationRequest,\n MfaEnrollmentStatus,\n SecurityOverview,\n LoginHistoryRow,\n ActiveSession,\n PaginationResponse\n} from './core/types'\n\nexport { api }\n\n/** Storage helpers and CRM stores. */\nexport const store = {\n storage,\n tableUi: { store: tableUiStore, actions: tableUiActions },\n table: { store: tableStore, actions: tableActions },\n user: { store: userStore, actions: userActions },\n note: { store: noteStore, actions: noteActions },\n email: { store: emailStore, actions: emailActions },\n sync: { store: syncStore, actions: syncActions }\n}\n"]}
1
+ {"version":3,"sources":["../src/main/features/accounts/client/accounts-client.ts","../src/main/api/nested-accounts-api.ts","../src/main/features/mobile/client/mobile-navigation-client.ts","../src/main/api/nested-mobile-api.ts","../src/main/api/compose-api.ts","../src/main/core/utils/datetime.ts","../src/main/core/http/mobile-client-config.ts","../src/main/index.ts"],"names":["storage","actions"],"mappings":"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","file":"index.js","sourcesContent":["import { API_ENDPOINTS, HttpClient } from '../../../core/http/client-context'\n\nexport const accountsClient = {\n listHubspots: () => HttpClient.get(API_ENDPOINTS.HUBSPOTS),\n listPortals: (hubId: number) => HttpClient.get(API_ENDPOINTS.PORTALS, { hubId })\n}\n","import { accountsClient } from '../features/accounts/client/accounts-client'\n\n/** Client account listing (hubspots / portals) for mobile and multi-account flows. */\nexport const accountsApi = {\n listHubspots: accountsClient.listHubspots,\n listPortals: accountsClient.listPortals\n}\n","import { generateApiUrl, API_ENDPOINTS, HttpClient } from '../../../core/http/client-context'\n\nexport const mobileNavigationClient = {\n getNavigation: () => HttpClient.get(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION })),\n getAppConfig: () => HttpClient.get(generateApiUrl({ route: API_ENDPOINTS.MOBILE_APP_CONFIG })),\n putNavigation: (payload: unknown) => HttpClient.put(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION }), payload),\n importFromWebMenu: (payload: unknown) => HttpClient.post(generateApiUrl({ route: API_ENDPOINTS.MOBILE_NAVIGATION_IMPORT_WEB_MENU }), payload)\n}\n","import { mobileNavigationClient } from '../features/mobile/client/mobile-navigation-client'\n\n/** Mobile-specific API surface (navigation config, etc.). */\nexport const mobileApi = {\n getNavigation: mobileNavigationClient.getNavigation,\n getAppConfig: mobileNavigationClient.getAppConfig,\n putNavigation: mobileNavigationClient.putNavigation,\n importFromWebMenu: mobileNavigationClient.importFromWebMenu\n}\n","import { authApi } from './nested-auth-api'\nimport { crmApi } from './nested-crm-api'\nimport { navigationApi } from './navigation-api'\nimport { accountsApi } from './nested-accounts-api'\nimport { mobileApi } from './nested-mobile-api'\n\n/** Public API — nested domains only (SDK 4.0). */\nexport const api = {\n auth: authApi,\n crm: crmApi,\n navigation: navigationApi,\n accounts: accountsApi,\n mobile: mobileApi\n}\n","/** HubSpot portal default; override when portal timezone is available from config. */\nexport const DEFAULT_HUBSPOT_TIMEZONE = 'Asia/Kolkata'\n\n/**\n * Detect the runtime/browser IANA timezone (e.g. `Asia/Kolkata`).\n * Falls back to the WoodsPortal default timezone when unavailable.\n */\nexport function getCurrentTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || DEFAULT_HUBSPOT_TIMEZONE\n } catch {\n return DEFAULT_HUBSPOT_TIMEZONE\n }\n}\n\n/**\n * Coerce HubSpot-style timestamps (ms string/number) to epoch milliseconds.\n */\nexport function normalizeToTimestamp(value: unknown): number | null {\n if (value == null || value === '') return null\n\n if (typeof value === 'number') {\n return value > 100_000_000_000 ? value : null\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value)) {\n const n = Number(value)\n return n > 100_000_000_000 ? n : null\n }\n\n if (typeof value === 'string' || value instanceof Date) {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date.getTime()\n }\n\n return null\n}\n\n/**\n * GMT offset label aligned with HubSpot activity timeline (e.g. `GMT+5:30`).\n */\nexport function formatGmtOffset(timeZone: string = getCurrentTimeZone(), date: Date = new Date()): string {\n const raw = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'longOffset'\n })\n .formatToParts(date)\n .find((part) => part.type === 'timeZoneName')?.value\n\n if (!raw) return ''\n\n // Intl may emit GMT+05:30; HubSpot uses GMT+5:30.\n return raw.replace(/GMT([+-])0(\\d)(?=:)/, 'GMT$1$2')\n}\n\nexport type HubSpotActivityDateTimeParts = {\n date: string\n time: string\n gmtOffset: string\n /** Full HubSpot-style label, e.g. `May 27, 2026 at 11:31 PM GMT+5:30`. */\n formatted: string\n}\n\n/**\n * Format a HubSpot epoch-ms timestamp like the CRM activity timeline.\n */\nexport function formatHubSpotActivityDateTimeParts(timestamp: unknown, timeZone: string = getCurrentTimeZone()): HubSpotActivityDateTimeParts | null {\n const ms = normalizeToTimestamp(timestamp)\n if (ms == null) return null\n\n const date = new Date(ms)\n const datePart = new Intl.DateTimeFormat('en-US', {\n timeZone,\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n }).format(date)\n const timePart = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n }).format(date)\n const gmtOffset = formatGmtOffset(timeZone, date)\n\n return {\n date: datePart,\n time: timePart,\n gmtOffset,\n formatted: `${datePart} at ${timePart} ${gmtOffset}`.trim()\n }\n}\n\n/**\n * @returns HubSpot activity string, e.g. `May 27, 2026 at 11:31 PM GMT+5:30`, or empty string.\n */\nexport function formatHubSpotActivityDateTime(timestamp: unknown, timeZone: string = getCurrentTimeZone()): string {\n return formatHubSpotActivityDateTimeParts(timestamp, timeZone)?.formatted ?? ''\n}\n","import type { SessionStorageAdapter } from '../storage/session-storage-adapter'\nimport { registerSessionStorageAdapter } from '../storage/session-storage-registry'\nimport { setClientType } from './client-type'\nimport { initializeHttpClient, type HttpClientConfig } from './http-client'\nimport { hydrateSessionRefreshState } from './token-store'\nimport { hydrateMfaPendingAccessToken } from '../auth/mfa-pending-token-storage'\nimport { storAccessToken } from './token-store'\nimport { hydrateUserStoreFromSession } from '../../state/crm/use-user'\n\nexport type MobileClientConfig = HttpClientConfig & {\n storage: SessionStorageAdapter\n}\n\n/**\n * Configure the SDK for native/mobile hosts: pluggable storage, client type `mobile`,\n * and `X-Client-Type: mobile` on all HTTP requests.\n */\nexport function initializeMobileClient({ storage, ...httpConfig }: MobileClientConfig): void {\n registerSessionStorageAdapter(storage)\n setClientType('mobile')\n hydrateSessionRefreshState()\n void hydrateMfaPendingAccessToken({\n lane: 'c',\n setAccessToken: (token, expiresIn) => {\n storAccessToken(token, expiresIn)\n }\n })\n hydrateUserStoreFromSession()\n initializeHttpClient({\n ...httpConfig,\n headers: {\n 'X-Client-Type': 'mobile',\n ...httpConfig.headers\n }\n })\n}\n","/**\n * WoodsPortal client SDK — public entry module.\n *\n * Configure HTTP once with {@link initializeHttpClient} in production, then use\n * {@link api}, {@link store}, and {@link api.navigation}.\n */\nimport { api } from './api/compose-api'\nimport {\n tableStore,\n tableActions,\n tableUiStore,\n tableUiActions,\n userStore,\n userActions,\n noteStore,\n noteActions,\n emailStore,\n emailActions,\n syncStore,\n syncActions\n} from './state'\nimport { storage } from './core/utils/localStorage'\n\nexport {\n DEFAULT_HUBSPOT_TIMEZONE,\n getCurrentTimeZone,\n formatGmtOffset,\n formatHubSpotActivityDateTime,\n formatHubSpotActivityDateTimeParts,\n normalizeToTimestamp\n} from './core/utils/datetime'\nexport type { HubSpotActivityDateTimeParts } from './core/utils/datetime'\nexport {\n purgeCrmObjectDataCache,\n purgeCrmListCache,\n purgeCrmListCacheAfterCrmWrite,\n purgeCrmDetailAndListAfterCrmWrite,\n purgeCrmRecordCache,\n purgeEngagementCaches,\n purgeEngagementCachesAfterCrmWrite,\n purgeCrmCombined,\n buildCachePurgeRequest,\n buildCrmListPurgeTarget,\n buildCrmSinglePurgeTarget,\n buildEngagementPurgeTarget,\n buildPortalConfigPurgeTarget,\n buildUserSessionPurgeTarget,\n mergePurgeTargets,\n createCachePurgeJob,\n extractHubspotRecordIdFromWriteResponse,\n extractEngagementItemIdFromWriteResponse,\n resolveCrmListPurgeQuery,\n toCachePurgeListQuery\n} from './core/utils/cache'\nexport type { CrmCachePurgeOptions } from './core/types/cache-purge'\nexport type {\n CachePurgeRequest,\n CachePurgeTarget,\n CachePurgeListQuery,\n CachePurgeView,\n CachePurgeDomain,\n CachePurgeMode,\n PurgeResult,\n CreateCachePurgeJobOptions\n} from './core/types/cache-purge'\n\n/** Axios setup, error helpers, and {@link HttpClientConfig}. */\nexport { initializeHttpClient, getFormErrors, getFieldErrors } from './core/http/http-client'\nexport type { HttpClientConfig, StorageKeyConfig } from './core/http/http-client'\nexport { initializeMobileClient } from './core/http/mobile-client-config'\nexport type { MobileClientConfig } from './core/http/mobile-client-config'\nexport type { SessionStorageAdapter } from './core/storage/session-storage-adapter'\nexport { getClientType } from './core/http/client-type'\n\n/** Shared auth contract (client + admin consistency). */\nexport {\n AuthErrorCode,\n parseApiErrorPayload,\n getUnauthorizedPageCopy,\n resolveAuthErrorAction,\n isOptionalAuthFailureUrl,\n isSessionProbeUrl,\n persistAuthError,\n readPersistedAuthError,\n hasValidAccess,\n isFullyAuthenticated,\n isMfaPendingSession,\n hasAuthenticatedAccess,\n recoverMfaGateOnBoot,\n startVisibilityRefreshScheduler,\n stopVisibilityRefreshScheduler,\n resolveAuthRouteAction,\n storeMfaPendingAccessToken,\n readMfaPendingAccessToken,\n clearMfaPendingAccessToken,\n hydrateMfaPendingAccessToken,\n isMfaPendingAccessSession\n} from './core/auth/index.js'\nexport type {\n ApiErrorPayload,\n StoredAuthError,\n AuthErrorCodeValue,\n UnauthorizedPageCopy,\n AuthErrorAction,\n AuthPolicyRoutes,\n AuthInterceptorPolicyConfig,\n WoodsportalRequestConfig,\n SessionContractInput,\n MfaBootRecoveryResult,\n AuthRouteAction,\n AuthFunnelState,\n MfaStorageLane,\n MfaPendingAccessToken,\n HydrateMfaPendingAccessTokenInput\n} from './core/auth/index.js'\nexport { classifyHttpError, getHttpErrorMessage, isServiceUnavailableError, SERVICE_UNAVAILABLE_MESSAGE } from './core/http/http-errors'\nexport type { HttpErrorKind } from './core/http/http-errors'\n\nexport {\n API_ERROR_DISPLAY_CONFIG,\n API_ERROR_CATEGORY_FALLBACK,\n WOODSPORTAL_API_ACTIVE_ERROR_CODES,\n buildErrorDescription,\n getApiErrorFromUnknown,\n resolveApiErrorDisplay,\n resolveApiContentState,\n isExpectedApiError\n} from './core/errors/index.js'\nexport type {\n ApiErrorVariant,\n ApiContentVariant,\n ApiErrorSeverity,\n ApiErrorDisplayConfig,\n ResolvedApiErrorDisplay,\n ResolvedApiContentState,\n ResolveApiErrorDisplayOptions\n} from './core/errors/index.js'\n\nexport { configureLogger } from './core/logging/logger'\nexport type { LogLevel, LoggerConfig } from './core/logging/logger-types'\n\nexport { Client } from './core/http/client-assembler'\nexport { config as hubContext, setConfig as setHubContext } from './core/utils/hub-context'\n\nexport { WP_STORAGE_KEYS, WP_UI_THEME, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './core/utils/wp-storage-keys'\nexport {\n migrateLegacyStorageKeys,\n getClientAuthCookieNamesToClear,\n clearClientSessionStorageKeys,\n clearClientIframeRefreshLocalKeys,\n clearStaleIframeRefreshForOtherHubs\n} from './core/utils/storage-migration'\nexport { clearClientAuthCookies } from './core/utils/cookie'\nexport { clearClientSdkSession, resetSessionStores } from './core/http/session-teardown'\nexport { setSessionLifecycleListener } from './core/http/token-store'\nexport { signalSessionChanged, installCrossTabSessionListener, applyCrossTabSessionRevocation } from './core/http/cross-tab-session'\nexport { configureStorageKeys, getStorageKeys, resetStorageKeysForTests } from './core/utils/storage-keys'\n\nexport {\n HUBSPOT_DEALS_OBJECT_TYPE_ID,\n HUBSPOT_TICKETS_OBJECT_TYPE_ID,\n PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS,\n PIPELINE_BOARD_OBJECT_TYPE_IDS,\n isPipelineBoardObjectTypeId\n} from './core/constants/hubspot-object-type-ids'\nexport { isPipelineBoardObjectType, supportsBoardView, shouldShowPipelineSelector } from './core/constants/pipeline-ui'\n\nexport type {\n Config,\n MutationOptions,\n PreLoginPayload,\n LoginPayload,\n VerifyEmailPayload,\n ResetPasswordVerifyTokenPayload,\n ResetPasswordPayload,\n ForgetPasswordPayload,\n ChangePasswordPayload,\n MfaMethod,\n MfaMethodOption,\n MfaPortalScopeContext,\n LoginResponseData,\n TwoFaVerificationRequest,\n MfaEnrollmentStatus,\n SecurityOverview,\n LoginHistoryRow,\n ActiveSession,\n PaginationResponse\n} from './core/types'\n\nexport { api }\n\n/** Storage helpers and CRM stores. */\nexport const store = {\n storage,\n tableUi: { store: tableUiStore, actions: tableUiActions },\n table: { store: tableStore, actions: tableActions },\n user: { store: userStore, actions: userActions },\n note: { store: noteStore, actions: noteActions },\n email: { store: emailStore, actions: emailActions },\n sync: { store: syncStore, actions: syncActions }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { M as MutationOptions } from './index-Bh9eY8sA.js';
1
+ import { M as MutationOptions } from './index-DhoGEpj3.js';
2
2
 
3
3
  declare function purge(options?: MutationOptions<unknown, unknown>): {
4
4
  mutate: (payload?: Record<string, unknown> | undefined) => Promise<unknown>;
@@ -245,4 +245,4 @@ declare function isPipelineBoardObjectType(objectTypeId: string | undefined | nu
245
245
  declare function supportsBoardView(objectTypeId: string | undefined | null): boolean;
246
246
  declare function shouldShowPipelineSelector(objectTypeId: string | undefined | null, pipelineCount: number): boolean;
247
247
 
248
- export { type CachePurgeRequest as A, type CachePurgeListQuery as B, type CachePurgeTarget as C, type CachePurgeView as D, type CreateCachePurgeJobOptions as E, type CrmCachePurgeOptions as F, type CachePurgeDomain as G, type CachePurgeMode as H, HUBSPOT_DEALS_OBJECT_TYPE_ID as I, HUBSPOT_TICKETS_OBJECT_TYPE_ID as J, PIPELINE_BOARD_OBJECT_TYPE_IDS as K, PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS as L, isPipelineBoardObjectType as M, isPipelineBoardObjectTypeId as N, shouldShowPipelineSelector as O, type PurgeResult as P, supportsBoardView as Q, list$1 as a, list$2 as b, create as c, details as d, createExisting as e, form as f, list$3 as g, create$1 as h, update$1 as i, list$4 as j, create$2 as k, list as l, update$2 as m, list$5 as n, objectFormOptions as o, details$1 as p, download as q, removeExisting as r, sideBarList as s, addFolder as t, update as u, addFile as v, imageUpload as w, attachmentUpload as x, purge as y, purgeStatus as z };
248
+ export { type CachePurgeListQuery as A, type CachePurgeMode as B, type CachePurgeDomain as C, type CachePurgeRequest as D, type CachePurgeTarget as E, type CachePurgeView as F, type CreateCachePurgeJobOptions as G, type CrmCachePurgeOptions as H, HUBSPOT_DEALS_OBJECT_TYPE_ID as I, HUBSPOT_TICKETS_OBJECT_TYPE_ID as J, PIPELINE_REQUIRED_MANAGED_OBJECT_TYPE_IDS as K, type PurgeResult as L, isPipelineBoardObjectType as M, isPipelineBoardObjectTypeId as N, shouldShowPipelineSelector as O, PIPELINE_BOARD_OBJECT_TYPE_IDS as P, supportsBoardView as Q, list$1 as a, list$2 as b, create as c, details as d, createExisting as e, form as f, list$3 as g, create$1 as h, update$1 as i, list$4 as j, create$2 as k, list as l, update$2 as m, list$5 as n, objectFormOptions as o, details$1 as p, download as q, removeExisting as r, sideBarList as s, addFolder as t, update as u, addFile as v, imageUpload as w, attachmentUpload as x, purge as y, purgeStatus as z };
@@ -0,0 +1,4 @@
1
+ export { clearClientIframeRefreshLocalKeys, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, getClientAuthCookieNamesToClear, migrateLegacyStorageKeys } from './chunk-KPHAQNS2.js';
2
+ import './chunk-UDAPRD7Z.js';
3
+ //# sourceMappingURL=storage-migration-2PF52ZSB.js.map
4
+ //# sourceMappingURL=storage-migration-2PF52ZSB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"storage-migration-2NVJ3GNQ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"storage-migration-2PF52ZSB.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "woodsportal-client-sdk",
3
- "version": "4.0.7-dev.9",
3
+ "version": "4.0.8-dev.0",
4
4
  "description": "Official TypeScript/JavaScript SDK for WoodsPortal API - Authentication, user management, pipelines, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,6 +29,11 @@
29
29
  "import": "./dist/adapters/angular/index.js",
30
30
  "default": "./dist/adapters/angular/index.js"
31
31
  },
32
+ "./native": {
33
+ "types": "./dist/adapters/native/index.d.ts",
34
+ "import": "./dist/adapters/native/index.js",
35
+ "default": "./dist/adapters/native/index.js"
36
+ },
32
37
  "./auth": {
33
38
  "types": "./dist/entries/auth.d.ts",
34
39
  "import": "./dist/entries/auth.js",
@@ -1,5 +0,0 @@
1
- export { isOptionalAuthFailureUrl, isRefreshEndpointUrl, isSessionProbeUrl, persistAuthError, readPersistedAuthError, resolveAuthErrorAction } from './chunk-PRGN3FF6.js';
2
- import './chunk-COHBSTHF.js';
3
- import './chunk-UDAPRD7Z.js';
4
- //# sourceMappingURL=auth-interceptor-policy-CKXBTGBT.js.map
5
- //# sourceMappingURL=auth-interceptor-policy-CKXBTGBT.js.map
@@ -1,5 +0,0 @@
1
- export { clearRefreshToken, getPortal, getProfile, getRefreshToken, getSubscriptionType, setAccessToken, setLoggedInDetails, setPortal, setProfileDetails, setRefreshToken, setSubscriptionType } from './chunk-5NONTYJA.js';
2
- import './chunk-6XIX6R4X.js';
3
- import './chunk-UDAPRD7Z.js';
4
- //# sourceMappingURL=auth-utils-LT4JXJER.js.map
5
- //# sourceMappingURL=auth-utils-LT4JXJER.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/main/core/utils/constants.ts","../src/main/core/utils/localStorage.ts","../src/main/core/utils/runtime-hub-context.ts","../src/main/core/utils/hub-context.ts","../src/main/core/http/iframe-session-storage.ts","../src/main/core/utils/error-log-sanitize.ts","../src/main/core/logging/logger.ts","../src/main/core/auth/mfa-pending-token-storage.ts","../src/main/core/http/refresh-lock.ts","../src/main/core/http/token-store.ts","../src/main/core/http/auth-utils.ts"],"names":["config","storage","getRefreshToken"],"mappings":"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","file":"chunk-5NONTYJA.js","sourcesContent":["import { WP_STORAGE_KEYS } from './wp-storage-keys'\n\n// cookies (canonical wp.c.* names)\nexport const LOGIN_DETAILS = WP_STORAGE_KEYS.c.auth.login\nexport const REFRESH_TOKEN = WP_STORAGE_KEYS.c.auth.refresh\nexport const PORTAL = WP_STORAGE_KEYS.c.auth.portal\nexport const SUBSCRIPTION_TYPE = WP_STORAGE_KEYS.c.auth.sub\n\n// hub context fields inside wp.c.hub JSON blob\nexport const HUBSPOT_DATA = WP_STORAGE_KEYS.c.hub\nexport const HUB_ID = 'hubId'\nexport const DEV_PORTAL_ID = 'devPortalId'\nexport const PORTAL_ID = 'portalId'\nexport const DEV_API_URL = 'devApiUrl'\n","type StringStore = {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nconst memory = new Map<string, string>()\n\nconst memoryStore: StringStore = {\n getItem(key: string) {\n return memory.has(key) ? memory.get(key)! : null\n },\n setItem(key: string, value: string) {\n memory.set(key, value)\n },\n removeItem(key: string) {\n memory.delete(key)\n }\n}\n\nfunction resolveStore(): StringStore {\n if (typeof globalThis === 'undefined') {\n return memoryStore\n }\n const ls = (globalThis as unknown as { localStorage?: StringStore }).localStorage\n if (!ls || typeof ls.getItem !== 'function') {\n return memoryStore\n }\n try {\n const probeKey = '__woodsportal_client_sdk_ls_probe__'\n ls.setItem(probeKey, '1')\n ls.removeItem(probeKey)\n return ls\n } catch {\n return memoryStore\n }\n}\n\nexport const storage = {\n set: (key: string, value: unknown) => {\n resolveStore().setItem(key, JSON.stringify(value))\n },\n\n get: <T>(key: string): T | null => {\n const item = resolveStore().getItem(key)\n return item ? (JSON.parse(item) as T) : null\n },\n\n remove: (key: string) => {\n resolveStore().removeItem(key)\n }\n}\n","/** Initialized HTTP client hub context — fallback when storage is empty (avoids import cycles). */\nlet initializedHubId = ''\nlet initializedDevPortalId = ''\nlet initializedDevApiUrl = ''\n\nexport function setRuntimeHttpClientHubContext(partial: { hubId?: string; devPortalId?: string; devApiUrl?: string }): void {\n if (partial.hubId != null) {\n initializedHubId = partial.hubId\n }\n if (partial.devPortalId != null) {\n initializedDevPortalId = partial.devPortalId\n }\n if (partial.devApiUrl != null) {\n initializedDevApiUrl = partial.devApiUrl\n }\n}\n\nexport function getRuntimeHttpClientHubId(): string {\n return initializedHubId\n}\n\nexport function getRuntimeHttpClientDevPortalId(): string {\n return initializedDevPortalId\n}\n\nexport function getRuntimeHttpClientDevApiUrl(): string {\n return initializedDevApiUrl\n}\n\n/** @internal Vitest only */\nexport function resetRuntimeHttpClientHubContextForTests(): void {\n initializedHubId = ''\n initializedDevPortalId = ''\n initializedDevApiUrl = ''\n}\n","import { Config, HubspotStorage } from '../types'\nimport { HUBSPOT_DATA, HUB_ID, DEV_PORTAL_ID, PORTAL_ID, DEV_API_URL } from './constants'\nimport { storage } from './localStorage'\nimport { getRuntimeHttpClientDevApiUrl, getRuntimeHttpClientDevPortalId, getRuntimeHttpClientHubId } from './runtime-hub-context'\n\nfunction readStorageField(key: string): string {\n const hubSpotData = storage.get<Record<string, string>>(HUBSPOT_DATA)\n const value = hubSpotData?.[key]\n return value != null && String(value).trim() !== '' ? String(value) : ''\n}\n\nexport const config = {\n get hubId() {\n return readStorageField(HUB_ID) || getRuntimeHttpClientHubId()\n },\n get devPortalId() {\n return readStorageField(DEV_PORTAL_ID) || getRuntimeHttpClientDevPortalId()\n },\n get portalId() {\n return readStorageField(PORTAL_ID)\n },\n get devApiUrl() {\n return readStorageField(DEV_API_URL) || getRuntimeHttpClientDevApiUrl()\n }\n} satisfies Config\n\nexport const setConfig = {\n setDevPortalId(portalId: string) {\n const existing = storage.get<HubspotStorage>(HUBSPOT_DATA) || {}\n\n storage.set(HUBSPOT_DATA, {\n ...existing,\n [PORTAL_ID]: portalId\n })\n }\n}\n","/**\n * Iframe-safe refresh token persistence (HubSpot CMS editor third-party cookie fallback).\n */\n\nimport { wpClientIframeRefreshExpKey, wpClientIframeRefreshKey, WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\nimport { config } from '../utils/hub-context'\n\nlet iframeStorageMode = false\n\nexport function setIframeStorageMode(enabled: boolean): void {\n iframeStorageMode = enabled\n}\n\nexport function isIframeStorageMode(): boolean {\n return iframeStorageMode\n}\n\nfunction resolveHubId(): string | number {\n const fromWindow =\n typeof window !== 'undefined' ? (window as Window & { hubSpotData?: { hubId?: string | number } }).hubSpotData?.hubId : undefined\n const fromConfig = config.hubId\n return fromWindow ?? fromConfig ?? 'default'\n}\n\nfunction iframeKey(): string {\n return wpClientIframeRefreshKey(resolveHubId())\n}\n\nfunction iframeExpKey(): string {\n return wpClientIframeRefreshExpKey(resolveHubId())\n}\n\nexport function readIframeRefreshToken(): string | null {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null\n }\n try {\n const raw = window.localStorage.getItem(iframeKey())\n return raw ? (JSON.parse(raw) as string) : null\n } catch {\n return null\n }\n}\n\nexport function writeIframeRefreshToken(token: string, expiresAtMs?: number): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.setItem(iframeKey(), JSON.stringify(token))\n if (expiresAtMs != null) {\n window.localStorage.setItem(iframeExpKey(), String(expiresAtMs))\n }\n } catch {\n // private mode / blocked storage\n }\n}\n\nexport function clearIframeRefreshToken(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.removeItem(iframeKey())\n window.localStorage.removeItem(iframeExpKey())\n } catch {\n // ignore\n }\n}\n\nexport function iframeRefreshTokenExpired(): boolean {\n if (typeof window === 'undefined' || !window.localStorage) {\n return true\n }\n try {\n const expRaw = window.localStorage.getItem(iframeExpKey())\n if (!expRaw) {\n return false\n }\n const exp = Number(expRaw)\n return Number.isFinite(exp) && Date.now() > exp\n } catch {\n return true\n }\n}\n\nexport function listIframeRefreshKeyPrefixes(): string[] {\n return ['wp_iframe_rt_', WP_STORAGE_KEYS.c.auth.iframeRtPrefix]\n}\n","const SENSITIVE_FIELD_NAMES = new Set(['token', 'refreshtoken', 'accesstoken', 'password', 'secret', 'authorization', 'otp', 'code'])\n\nfunction isSensitiveField(name: string): boolean {\n const normalized = name.toLowerCase()\n return SENSITIVE_FIELD_NAMES.has(normalized) || normalized.includes('password')\n}\n\nfunction redactValue(value: unknown): unknown {\n if (value == null || typeof value !== 'object') {\n return value\n }\n if (Array.isArray(value)) {\n return value.map(redactValue)\n }\n\n const input = value as Record<string, unknown>\n const output: Record<string, unknown> = {}\n for (const [key, nested] of Object.entries(input)) {\n output[key] = isSensitiveField(key) ? '[redacted]' : redactValue(nested)\n }\n return output\n}\n\n/** Prefer structured API error fields; fall back to redacted payload. */\nexport function sanitizeAxiosErrorData(data: unknown): unknown {\n if (data == null || typeof data !== 'object') {\n return data\n }\n\n const payload = data as Record<string, unknown>\n const safeFields = ['errorCode', 'message', 'errorMessage', 'detailedMessage', 'correlationId', 'category', 'statusCode'] as const\n\n const summary: Record<string, unknown> = {}\n for (const field of safeFields) {\n if (field in payload) {\n summary[field] = payload[field]\n }\n }\n\n if (Object.keys(summary).length > 0) {\n return summary\n }\n\n return redactValue(payload)\n}\n\n/** Redact sensitive keys from arbitrary log metadata. */\nexport function redactLogMeta(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (meta == null) {\n return meta\n }\n return redactValue(meta) as Record<string, unknown>\n}\n","import axios from 'axios'\nimport { sanitizeAxiosErrorData, redactLogMeta } from '../utils/error-log-sanitize'\nimport type { LogLevel, LogMeta, LoggerConfig, SdkLogger } from './logger-types'\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4\n}\n\nconst DEFAULT_CONFIG = {\n level: 'info' as LogLevel,\n namespace: 'woodsportal-sdk',\n enabled: true,\n httpTracing: true\n}\n\nlet runtimeConfig = { ...DEFAULT_CONFIG }\nlet customSinks: LoggerConfig['sinks']\n\nfunction shouldEmit(level: LogLevel): boolean {\n if (!runtimeConfig.enabled || runtimeConfig.level === 'silent') {\n return false\n }\n return LEVEL_RANK[level] >= LEVEL_RANK[runtimeConfig.level]\n}\n\nfunction formatPrefix(context: string): string {\n return `[${runtimeConfig.namespace}] ${context}`\n}\n\nfunction defaultDebug(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.debug(formatPrefix(context), message, meta)\n return\n }\n console.debug(formatPrefix(context), message)\n}\n\nfunction defaultInfo(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.info(formatPrefix(context), message, meta)\n return\n }\n console.info(formatPrefix(context), message)\n}\n\nfunction defaultWarn(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.warn(formatPrefix(context), message, meta)\n return\n }\n console.warn(formatPrefix(context), message)\n}\n\nfunction defaultError(context: string, error: unknown, meta?: LogMeta): void {\n if (axios.isAxiosError(error)) {\n const payload = {\n message: error.message,\n status: error.response?.status,\n statusText: error.response?.statusText,\n data: sanitizeAxiosErrorData(error.response?.data),\n url: error.config?.url,\n method: error.config?.method,\n ...redactLogMeta(meta)\n }\n console.error(formatPrefix(context), payload)\n return\n }\n\n if (error instanceof Error) {\n if (meta != null) {\n console.error(formatPrefix(context), error.message, error, redactLogMeta(meta))\n return\n }\n console.error(formatPrefix(context), error.message, error)\n return\n }\n\n if (meta != null) {\n console.error(formatPrefix(context), error, redactLogMeta(meta))\n return\n }\n console.error(formatPrefix(context), error)\n}\n\nexport function configureLogger(config: LoggerConfig = {}): void {\n runtimeConfig = {\n level: config.level ?? DEFAULT_CONFIG.level,\n namespace: config.namespace ?? DEFAULT_CONFIG.namespace,\n enabled: config.enabled ?? DEFAULT_CONFIG.enabled,\n httpTracing: config.httpTracing ?? DEFAULT_CONFIG.httpTracing\n }\n customSinks = config.sinks\n}\n\n/** Test helper — restore defaults between test files. */\nexport function resetLoggerForTests(): void {\n runtimeConfig = { ...DEFAULT_CONFIG }\n customSinks = undefined\n}\n\nexport function isHttpTracingEnabled(): boolean {\n return runtimeConfig.enabled && runtimeConfig.httpTracing && shouldEmit('debug')\n}\n\nexport function getLoggerLevel(): LogLevel {\n return runtimeConfig.level\n}\n\nexport const logger: SdkLogger = {\n debug(context, message, meta) {\n if (!shouldEmit('debug')) return\n const sink = customSinks?.debug ?? defaultDebug\n sink(context, message, redactLogMeta(meta))\n },\n info(context, message, meta) {\n if (!shouldEmit('info')) return\n const sink = customSinks?.info ?? defaultInfo\n sink(context, message, redactLogMeta(meta))\n },\n warn(context, message, meta) {\n if (!shouldEmit('warn')) return\n const sink = customSinks?.warn ?? defaultWarn\n sink(context, message, redactLogMeta(meta))\n },\n error(context, error, meta) {\n if (!shouldEmit('error')) return\n const sink = customSinks?.error ?? defaultError\n sink(context, error, redactLogMeta(meta))\n }\n}\n\nexport type { LogLevel, LogMeta, LoggerConfig, SdkLogger } from './logger-types'\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\n\nexport type MfaStorageLane = 'c' | 'a'\n\ntype MfaPendingTokenKeys = {\n token: string\n exp: string\n}\n\nfunction keysForLane(lane: MfaStorageLane): MfaPendingTokenKeys {\n const mfa = lane === 'a' ? WP_STORAGE_KEYS.a.mfa : WP_STORAGE_KEYS.c.mfa\n return {\n token: mfa.pendingToken,\n exp: mfa.pendingTokenExp\n }\n}\n\nexport type MfaPendingAccessToken = {\n token: string\n expiresAt: number\n}\n\nfunction readExpiresAt(raw: string | null): number | null {\n if (raw == null || raw === '') {\n return null\n }\n const parsed = Number(raw)\n return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction getSessionStorage(): Storage | null {\n if (typeof globalThis === 'undefined') {\n return null\n }\n try {\n if (globalThis.sessionStorage != null) {\n return globalThis.sessionStorage\n }\n const win = globalThis.window as (Window & typeof globalThis) | undefined\n return win?.sessionStorage ?? null\n } catch {\n return null\n }\n}\n\n/** Persist temp MFA access JWT for mid-gate page refresh (tab-scoped sessionStorage). */\nexport function storeMfaPendingAccessToken(token: string, expiresInSeconds: number | undefined, lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n if (!token || typeof token !== 'string') {\n return\n }\n\n const keys = keysForLane(lane)\n const expiresAt =\n typeof expiresInSeconds === 'number' && expiresInSeconds > 0 ? Date.now() + expiresInSeconds * 1000 : Date.now() + 15 * 60 * 1000\n\n try {\n storage.setItem(keys.token, token)\n storage.setItem(keys.exp, String(expiresAt))\n } catch {\n // ignore quota / private mode\n }\n}\n\n/** Read temp MFA JWT if present and not expired. */\nexport function readMfaPendingAccessToken(lane: MfaStorageLane = 'c'): MfaPendingAccessToken | null {\n const storage = getSessionStorage()\n if (!storage) {\n return null\n }\n\n const keys = keysForLane(lane)\n try {\n const token = storage.getItem(keys.token)\n if (!token) {\n return null\n }\n\n const expiresAt = readExpiresAt(storage.getItem(keys.exp))\n if (expiresAt == null || Date.now() >= expiresAt) {\n clearMfaPendingAccessToken(lane)\n return null\n }\n\n return { token, expiresAt }\n } catch {\n return null\n }\n}\n\nexport function clearMfaPendingAccessToken(lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n\n const keys = keysForLane(lane)\n try {\n storage.removeItem(keys.token)\n storage.removeItem(keys.exp)\n } catch {\n // ignore\n }\n}\n\n/** True when sessionStorage holds a valid temp MFA access JWT for the lane. */\nexport function isMfaPendingAccessSession(lane: MfaStorageLane = 'c'): boolean {\n return readMfaPendingAccessToken(lane) != null\n}\n\nexport type HydrateMfaPendingAccessTokenInput = {\n lane?: MfaStorageLane\n setAccessToken: (token: string, expiresInSeconds?: number) => void | Promise<void>\n}\n\n/** Restore in-memory MFA temp JWT from sessionStorage after refresh. Returns true when hydrated. */\nexport async function hydrateMfaPendingAccessToken(input: HydrateMfaPendingAccessTokenInput): Promise<boolean> {\n const lane = input.lane ?? 'c'\n const pending = readMfaPendingAccessToken(lane)\n if (!pending) {\n return false\n }\n\n const ttlSeconds = Math.max(1, Math.floor((pending.expiresAt - Date.now()) / 1000))\n await input.setAccessToken(pending.token, ttlSeconds)\n return true\n}\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\n\nconst LOCK_NAME = 'wp.client.auth.refresh'\nconst STORAGE_LOCK_KEY = WP_STORAGE_KEYS.c.auth.refreshLock\nconst LOCK_TTL_MS = 30_000\n\nasync function withNavigatorLock<T>(fn: () => Promise<T>): Promise<T> {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return navigator.locks.request(LOCK_NAME, fn)\n }\n return fn()\n}\n\nfunction tryAcquireStorageLock(): boolean {\n if (typeof window === 'undefined' || !window.localStorage) {\n return true\n }\n try {\n const raw = window.localStorage.getItem(STORAGE_LOCK_KEY)\n const now = Date.now()\n if (raw) {\n const ts = Number(raw)\n if (Number.isFinite(ts) && now - ts < LOCK_TTL_MS) {\n return false\n }\n }\n window.localStorage.setItem(STORAGE_LOCK_KEY, String(now))\n return true\n } catch {\n return true\n }\n}\n\nfunction releaseStorageLock(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.removeItem(STORAGE_LOCK_KEY)\n } catch {\n // ignore\n }\n}\n\nasync function waitForStorageLock(maxWaitMs = LOCK_TTL_MS): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < maxWaitMs) {\n if (tryAcquireStorageLock()) {\n return\n }\n await new Promise((r) => setTimeout(r, 200))\n }\n}\n\n/**\n * Cross-tab singleflight around refresh token rotation.\n */\nexport async function withRefreshLock<T>(fn: () => Promise<T>): Promise<T> {\n return withNavigatorLock(async () => {\n await waitForStorageLock()\n try {\n return await fn()\n } finally {\n releaseStorageLock()\n }\n })\n}\n\n/** Test-only: drop stale cross-tab refresh lock from localStorage. */\nexport function clearRefreshLockForTests(): void {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n window.localStorage.removeItem(STORAGE_LOCK_KEY)\n } catch {\n // ignore — jsdom may be torn down between files\n }\n}\n","/**\n\n * Token storage utilities\n\n * These functions handle access token management\n\n */\n\nimport { getCookie, isCookieExpired, isCorruptCookieRawValue } from '../utils/cookie.js'\n\nimport { getStorageKeys } from '../utils/storage-keys'\nimport { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\nimport { isIframeStorageMode, readIframeRefreshToken } from './iframe-session-storage.js'\nimport { logger } from '../logging/logger.js'\nimport { isMfaPendingAccessSession } from '../auth/mfa-pending-token-storage.js'\nimport { withRefreshLock } from './refresh-lock.js'\n\nlet accessToken: string | null = null\n\nlet tokenExpiresAt: number | null = null\n\nlet accessTtlMs: number | null = null\n\nlet refreshCallback: ((refreshToken: string) => Promise<{ token: string | null; success: boolean }>) | null = null\n\nlet refreshBufferSeconds = 60\n\nlet refreshPromise: Promise<void> | null = null\n\nlet lastRefreshFailed = false\n\nlet lastSuccessfulRefreshAt: number | null = null\n\nlet sessionLifecycleListener: (() => void) | null = null\n\nconst MIN_SHORT_TTL_BUFFER_MS = 5_000\n\nconst MIN_PROACTIVE_REFRESH_INTERVAL_MS = 30_000\n\n/** Exported for unit tests. */\n\nexport function getEffectiveBufferMs(ttlMs: number): number {\n const capMs = refreshBufferSeconds * 1000\n\n let buffer: number\n if (ttlMs <= capMs) {\n buffer = Math.max(MIN_SHORT_TTL_BUFFER_MS, Math.floor(ttlMs * 0.2))\n } else {\n buffer = capMs\n }\n\n // Buffer must stay inside the token lifetime — otherwise every request looks \"expired\".\n const maxBuffer = Math.max(0, ttlMs - 1_000)\n return Math.min(buffer, maxBuffer)\n}\n\nfunction getCurrentBufferMs(): number {\n if (accessTtlMs != null && accessTtlMs > 0) {\n return getEffectiveBufferMs(accessTtlMs)\n }\n\n return refreshBufferSeconds * 1000\n}\n\nexport function getAccessToken(): string | null {\n return accessToken\n}\n\nexport function setSessionLifecycleListener(listener: (() => void) | null): void {\n sessionLifecycleListener = listener\n}\n\nfunction notifySessionLifecycleChange(): void {\n try {\n sessionLifecycleListener?.()\n } catch {\n // ignore listener errors\n }\n}\n\nfunction persistRefreshExhausted(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n window.sessionStorage.setItem(WP_STORAGE_KEYS.c.auth.refreshExhausted, JSON.stringify({ ts: Date.now() }))\n } catch {\n // ignore quota / private mode\n }\n}\n\nfunction clearPersistedRefreshExhausted(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n window.sessionStorage.removeItem(WP_STORAGE_KEYS.c.auth.refreshExhausted)\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedRefreshExhausted(): boolean {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return false\n }\n try {\n return Boolean(window.sessionStorage.getItem(WP_STORAGE_KEYS.c.auth.refreshExhausted))\n } catch {\n return false\n }\n}\n\n/** Restore in-memory refresh-failure state after a full page reload (same tab). */\nexport function hydrateSessionRefreshState(): void {\n if (readPersistedRefreshExhausted()) {\n lastRefreshFailed = true\n }\n}\n\nexport function clearSessionRefreshExhaustedState(): void {\n lastRefreshFailed = false\n clearPersistedRefreshExhausted()\n}\n\nfunction markRefreshFailed(): void {\n lastRefreshFailed = true\n persistRefreshExhausted()\n clearAccessToken()\n notifySessionLifecycleChange()\n}\n\nexport function storAccessToken(token: string, expiresIn?: number): void {\n accessToken = token\n\n clearSessionRefreshExhaustedState()\n\n if (expiresIn != null && expiresIn > 0) {\n accessTtlMs = expiresIn * 1000\n\n tokenExpiresAt = Date.now() + accessTtlMs\n } else {\n accessTtlMs = null\n\n tokenExpiresAt = null\n }\n\n notifySessionLifecycleChange()\n}\n\nexport function clearAccessToken(): void {\n accessToken = null\n\n tokenExpiresAt = null\n\n accessTtlMs = null\n\n lastSuccessfulRefreshAt = null\n}\n\n/** Clears proactive refresh throttle only — refresh exhaustion survives until login or T3 sessionStorage clear. */\nexport function resetSessionAuthState(): void {\n lastSuccessfulRefreshAt = null\n}\n\nexport function setRefreshBufferSeconds(seconds: number): void {\n refreshBufferSeconds = Math.max(0, seconds)\n}\n\nexport function getRefreshBufferSeconds(): number {\n return refreshBufferSeconds\n}\n\nexport function didLastRefreshFail(): boolean {\n return lastRefreshFailed\n}\n\n/** Alias for route guards — refresh was attempted and failed with no new access JWT. */\nexport function isSessionRefreshExhausted(): boolean {\n if (lastRefreshFailed) {\n return true\n }\n if (readPersistedRefreshExhausted()) {\n lastRefreshFailed = true\n return true\n }\n return false\n}\n\nexport function isExpiresAccessToken(): boolean {\n if (!accessToken) return true\n\n if (tokenExpiresAt === null) return false\n\n const bufferMs = getCurrentBufferMs()\n\n return Date.now() >= tokenExpiresAt - bufferMs\n}\n\n/**\n\n * Set the refresh callback function\n\n * This is called by the HTTP client during initialization\n\n */\n\nexport function setRefreshCallback(callback: (refreshToken: string) => Promise<{ token: string | null; success: boolean }>): void {\n refreshCallback = callback\n}\n\nexport function isRefreshInFlight(): boolean {\n return refreshPromise != null\n}\n\nexport type RefreshSessionOptions = {\n /** Bypass min proactive refresh interval (e.g. 401 retry, cold bootstrap). */\n\n force?: boolean\n}\n\n/** Single deduped refresh entry point for bootstrap, HTTP client, and visibility handlers. */\n\nexport async function refreshSession(options: RefreshSessionOptions = {}): Promise<void> {\n const { force = false } = options\n\n if (isMfaPendingAccessSession('c') || isMfaPendingAccessSession('a')) {\n return\n }\n\n if (!force && lastSuccessfulRefreshAt != null && Date.now() - lastSuccessfulRefreshAt < MIN_PROACTIVE_REFRESH_INTERVAL_MS) {\n return\n }\n\n if (!refreshCallback) {\n return\n }\n\n if (!refreshPromise) {\n refreshPromise = (async () => {\n await withRefreshLock(async () => {\n const { getRefreshToken } = await import('./auth-utils.js')\n const refreshToken = getRefreshToken()\n\n if (!refreshToken) {\n markRefreshFailed()\n\n const storageKey = getStorageKeys().refreshToken\n const hasCookieKey =\n typeof document !== 'undefined' &&\n typeof storageKey === 'string' &&\n storageKey.length > 0 &&\n document.cookie.includes(`${storageKey}=`)\n\n logger.warn('auth', 'refresh session aborted: missing refresh token', {\n operation: 'refreshSession',\n storageKey,\n hasCookieKey,\n iframeStorageMode: isIframeStorageMode()\n })\n\n throw new Error('Session expired: missing refresh token')\n }\n\n const result = await refreshCallback!(refreshToken)\n\n if (!result.success || !result.token) {\n markRefreshFailed()\n\n throw new Error('Session refresh failed')\n }\n\n lastRefreshFailed = false\n\n lastSuccessfulRefreshAt = Date.now()\n })\n })().finally(() => {\n refreshPromise = null\n })\n }\n\n await refreshPromise\n}\n\n/**\n\n * Ensures the access token is valid, refreshing if necessary.\n\n * Throws when refresh is required but fails (avoids bearer-less 401 loops).\n\n */\n\nexport async function ensureValidRefresh(): Promise<void> {\n if (isMfaPendingAccessSession('c') || isMfaPendingAccessSession('a')) {\n return\n }\n\n if (!isExpiresAccessToken()) {\n return\n }\n\n // Pre-request refresh must not be throttled by the proactive min interval.\n await refreshSession({ force: true })\n}\n\nexport function isAuthenticateApp() {\n const token = getAccessToken()\n\n if (token) {\n const bufferMs = getCurrentBufferMs()\n\n if (tokenExpiresAt === null || Date.now() < tokenExpiresAt - bufferMs) {\n return true\n }\n }\n\n if (!isCookieExpired(getStorageKeys().refreshToken)) {\n if (lastRefreshFailed && !token) {\n return false\n }\n return true\n }\n\n return false\n}\n\n/** Preferred 3.0 name for {@link isAuthenticateApp}. */\n\nexport function isAuthenticated() {\n return isAuthenticateApp()\n}\n\n/** Preferred 3.0 name for {@link isExpiresAccessToken}. */\n\nexport function isAccessTokenExpired() {\n return isExpiresAccessToken()\n}\n\nexport function hasRefreshSession(): boolean {\n if (isSessionRefreshExhausted() && !accessToken) {\n return false\n }\n const refreshKey = getStorageKeys().refreshToken\n if (!refreshKey || isCookieExpired(refreshKey)) {\n return false\n }\n if (!readRefreshTokenValue()) {\n return false\n }\n if (lastRefreshFailed && !accessToken) {\n return false\n }\n return true\n}\n\nfunction readRefreshTokenValue(): string | null {\n const key = getStorageKeys().refreshToken\n const raw = getCookie(key)\n if (!isCorruptCookieRawValue(raw)) {\n return raw\n }\n if (isIframeStorageMode()) {\n return readIframeRefreshToken()\n }\n return null\n}\n\nexport function hasValidAccessToken(): boolean {\n return Boolean(getAccessToken()) && !isExpiresAccessToken()\n}\n","/**\n\n * Authentication utility functions\n\n * These handle refresh token management\n\n */\n\nimport { setCookie, parseCookieJson, stringifyCookieValue, getCookie, isCorruptCookieRawValue, removeCookie } from '../utils/cookie'\n\nimport { getStorageKeys } from '../utils/storage-keys'\n\nimport { storAccessToken } from './token-store'\n\nimport { isIframeStorageMode, readIframeRefreshToken, writeIframeRefreshToken } from './iframe-session-storage'\n\nfunction writeJsonCookie(key: string | undefined, data: unknown, expire?: number | Date): void {\n if (!key) {\n return\n }\n\n const serialized = stringifyCookieValue(data)\n\n if (serialized == null) {\n return\n }\n\n setCookie(key, serialized, expire)\n}\n\n// Set data\n\nexport const setLoggedInDetails = async (data: any) => {\n return new Promise((resolve: any) => {\n const keys = getStorageKeys()\n\n writeJsonCookie(keys.loginDetails, data)\n\n if (keys.authUser !== keys.loginDetails) {\n writeJsonCookie(keys.authUser, data)\n }\n\n resolve()\n })\n}\n\nexport const setProfileDetails = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().loginDetails, data)\n\n resolve()\n })\n}\n\nexport function setRefreshToken(token: string, expiresAt: number) {\n return new Promise((resolve: any) => {\n if (!token || typeof token !== 'string') {\n resolve()\n\n return\n }\n\n let expiresMs: number\n\n if (typeof expiresAt === 'number' && expiresAt > 1_000_000_000_000) {\n expiresMs = expiresAt\n } else if (typeof expiresAt === 'number' && expiresAt > 1_000_000_000) {\n expiresMs = expiresAt * 1000\n } else {\n expiresMs = Date.now() + (expiresAt || 0) * 1000\n }\n\n const serialized = stringifyCookieValue(token)\n\n if (serialized != null) {\n setCookie(getStorageKeys().refreshToken, serialized, new Date(expiresMs))\n }\n\n if (isIframeStorageMode()) {\n writeIframeRefreshToken(token, expiresMs)\n }\n\n resolve()\n })\n}\n\nexport function setAccessToken(token: string, expiresIn?: number) {\n return new Promise((resolve: any) => {\n storAccessToken(token, expiresIn)\n\n resolve()\n })\n}\n\nexport const setPortal = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().portal, data ?? {})\n\n resolve()\n })\n}\n\nexport const setSubscriptionType = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().subscriptionType, data ?? 'BASIC')\n\n resolve()\n })\n}\n\n// Get data\n\nexport function getProfile(): string | null {\n return parseCookieJson(getStorageKeys().loginDetails)\n}\n\nexport function getRefreshToken(): string | null {\n const raw = getCookie(getStorageKeys().refreshToken)\n\n if (!isCorruptCookieRawValue(raw)) {\n return raw\n }\n\n if (isIframeStorageMode()) {\n return readIframeRefreshToken()\n }\n\n return null\n}\n\n/** Clears stored refresh token (e.g. when entering MFA pending gate). */\nexport function clearRefreshToken(): void {\n const key = getStorageKeys().refreshToken\n if (key) {\n removeCookie(key)\n }\n if (isIframeStorageMode()) {\n writeIframeRefreshToken('', 0)\n }\n}\n\nexport function getPortal(): any | null {\n return parseCookieJson(getStorageKeys().portal)\n}\n\nexport function getSubscriptionType(): string | null {\n return parseCookieJson<string>(getStorageKeys().subscriptionType)\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/main/core/utils/storage-keys.ts","../src/main/core/utils/cookie.ts","../src/main/core/utils/storage-migration.ts"],"names":["Cookies"],"mappings":"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","file":"chunk-6XIX6R4X.js","sourcesContent":["import { WP_STORAGE_KEYS } from './wp-storage-keys'\n\nexport interface StorageKeyConfig {\n loginDetails?: string\n refreshToken?: string\n portal?: string\n subscriptionType?: string\n authUser?: string\n pagination?: string\n routeMenu?: string\n associationView?: string\n emailVerified?: string\n}\n\nconst defaults: Required<StorageKeyConfig> = {\n loginDetails: WP_STORAGE_KEYS.c.auth.login,\n refreshToken: WP_STORAGE_KEYS.c.auth.refresh,\n portal: WP_STORAGE_KEYS.c.auth.portal,\n subscriptionType: WP_STORAGE_KEYS.c.auth.sub,\n authUser: WP_STORAGE_KEYS.c.auth.login,\n pagination: WP_STORAGE_KEYS.c.ui.pag,\n routeMenu: WP_STORAGE_KEYS.c.ui.menu,\n associationView: WP_STORAGE_KEYS.c.ui.assoc,\n emailVerified: WP_STORAGE_KEYS.c.auth.emailOk\n}\n\nlet runtimeKeys: Required<StorageKeyConfig> = { ...defaults }\n\nexport function configureStorageKeys(overrides: StorageKeyConfig = {}): void {\n runtimeKeys = { ...defaults, ...runtimeKeys, ...overrides }\n if (overrides.authUser === undefined) {\n runtimeKeys.authUser = runtimeKeys.loginDetails\n }\n}\n\n/** Test helper — restore default cookie key names. */\nexport function resetStorageKeysForTests(): void {\n runtimeKeys = { ...defaults }\n}\n\nexport function getStorageKeys(): Readonly<Required<StorageKeyConfig>> {\n return runtimeKeys\n}\n\nexport { WP_STORAGE_KEYS } from './wp-storage-keys'\n","import Cookies from 'js-cookie'\nimport { getClientAuthCookieNamesToClear } from './storage-migration'\n\nfunction cookieSecureFlag(): boolean {\n if (typeof window === 'undefined') return true\n return window.location.protocol === 'https:'\n}\n\n/** Values that must never be persisted in readable cookies. */\nexport function isCorruptCookieRawValue(raw: string | null | undefined): boolean {\n return raw == null || raw === '' || raw === 'undefined' || raw === 'null'\n}\n\n/** Serialize a value for cookie storage; returns null when write should be skipped. */\nexport function stringifyCookieValue(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null\n }\n if (typeof value === 'string') {\n return isCorruptCookieRawValue(value) ? null : value\n }\n const serialized = JSON.stringify(value)\n if (serialized === undefined || isCorruptCookieRawValue(serialized)) {\n return null\n }\n return serialized\n}\n\nexport const setCookie = (key: string, value: string, expire?: number | Date) => {\n if (!key || isCorruptCookieRawValue(value)) {\n return undefined\n }\n return Cookies.set(key, value, {\n expires: expire,\n sameSite: cookieSecureFlag() ? 'none' : 'lax',\n secure: cookieSecureFlag()\n })\n}\n\nexport const getCookie: any = (key: any) => {\n return Cookies.get(key)\n}\n\n/** Parse JSON stored in a cookie; removes corrupt values on read (self-heal). */\nexport function parseCookieJson<T = unknown>(key: string | null | undefined): T | null {\n if (key == null || key === '') {\n return null\n }\n const raw = getCookie(key)\n if (isCorruptCookieRawValue(raw)) {\n if (raw === 'undefined' || raw === 'null') {\n Cookies.remove(key)\n }\n return null\n }\n try {\n return JSON.parse(raw) as T\n } catch {\n Cookies.remove(key)\n return null\n }\n}\n\nexport const removeCookie = (key: any) => {\n return Cookies.remove(key)\n}\n\n/** Clears client-portal session cookies only (does not wipe admin cookies on shared localhost). */\nexport const clearClientAuthCookies = () => {\n getClientAuthCookieNamesToClear().forEach((name) => Cookies.remove(name))\n for (const legacyAccess of ['woodsportal_access_token', 'AUTH_CRED']) {\n Cookies.remove(legacyAccess)\n }\n}\n\n/** @deprecated Prefer {@link clearClientAuthCookies} */\nexport const removeAllCookie = clearClientAuthCookies\n\nexport const isCookieExpired = (key: string): boolean => {\n const value = Cookies.get(key)\n if (value === undefined) {\n return true\n }\n try {\n const parsed = JSON.parse(value)\n if (parsed && typeof parsed === 'object' && 'expiresAt' in parsed) {\n const expiresAt = (parsed as { expiresAt?: number }).expiresAt\n return typeof expiresAt === 'number' && Date.now() > expiresAt\n }\n return false\n } catch {\n // Plain string values (e.g. refresh token) rely on browser cookie expiry.\n return false\n }\n}\n","import Cookies from 'js-cookie'\nimport {\n CLIENT_COOKIE_MIGRATIONS,\n CLIENT_SESSION_STORAGE_MIGRATIONS,\n LEGACY_CLIENT_AUTH_COOKIES,\n LEGACY_CLIENT_SESSION_EXACT,\n WP_STORAGE_KEYS,\n WP_UI_THEME,\n wpClientIframeRefreshKey,\n wpClientIframeRefreshExpKey\n} from './wp-storage-keys'\nimport { getStorageKeys } from './storage-keys'\nimport { isCorruptCookieRawValue } from './cookie'\n\nfunction migrateCookiePair(legacy: string, canonical: string): void {\n const value = Cookies.get(legacy)\n if (value === undefined) {\n return\n }\n if (isCorruptCookieRawValue(value)) {\n Cookies.remove(legacy)\n return\n }\n if (!Cookies.get(canonical)) {\n Cookies.set(canonical, value)\n }\n Cookies.remove(legacy)\n}\n\nfunction migrateLocalStoragePair(legacy: string, canonical: string): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const value = window.localStorage.getItem(legacy)\n if (value == null) {\n return\n }\n if (!window.localStorage.getItem(canonical)) {\n window.localStorage.setItem(canonical, value)\n }\n window.localStorage.removeItem(legacy)\n } catch {\n // private mode\n }\n}\n\nfunction migrateSessionStoragePair(legacy: string, canonical: string): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n const value = window.sessionStorage.getItem(legacy)\n if (value == null) {\n return\n }\n if (!window.sessionStorage.getItem(canonical)) {\n window.sessionStorage.setItem(canonical, value)\n }\n window.sessionStorage.removeItem(legacy)\n } catch {\n // ignore\n }\n}\n\nfunction migrateIframeRefreshKeys(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const keys = Object.keys(window.localStorage).filter((k) => k.startsWith('wp_iframe_rt_'))\n for (const legacyKey of keys) {\n const suffix = legacyKey.slice('wp_iframe_rt_'.length)\n if (suffix.endsWith('_exp')) {\n continue\n }\n const hubId = suffix\n const token = window.localStorage.getItem(legacyKey)\n const exp = window.localStorage.getItem(`${legacyKey}_exp`)\n const newKey = wpClientIframeRefreshKey(hubId)\n const newExpKey = wpClientIframeRefreshExpKey(hubId)\n if (token != null && !window.localStorage.getItem(newKey)) {\n window.localStorage.setItem(newKey, token)\n }\n if (exp != null && !window.localStorage.getItem(newExpKey)) {\n window.localStorage.setItem(newExpKey, exp)\n }\n window.localStorage.removeItem(legacyKey)\n window.localStorage.removeItem(`${legacyKey}_exp`)\n }\n } catch {\n // ignore\n }\n}\n\nfunction removeLegacyAccessTokenCookies(): void {\n const keys = getStorageKeys()\n const legacyAccess = ['woodsportal_access_token', 'AUTH_CRED']\n for (const name of legacyAccess) {\n Cookies.remove(name)\n }\n if (keys.authUser && keys.authUser !== keys.loginDetails) {\n // legacy duplicate profile mirror — uplift handled by migration; drop separate user cookie\n Cookies.remove(keys.authUser)\n }\n}\n\n/**\n * One-time uplift: read legacy browser keys, write canonical `wp.*` keys, delete legacy.\n * Safe to call on every boot (idempotent).\n */\nexport function migrateLegacyStorageKeys(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n for (const [legacy, canonical] of CLIENT_COOKIE_MIGRATIONS) {\n migrateCookiePair(legacy, canonical)\n }\n\n migrateLocalStoragePair('hubSpotData', WP_STORAGE_KEYS.c.hub)\n migrateLocalStoragePair('theme', WP_UI_THEME)\n\n for (const [legacy, canonical] of CLIENT_SESSION_STORAGE_MIGRATIONS) {\n migrateSessionStoragePair(legacy, canonical)\n }\n\n migrateIframeRefreshKeys()\n removeLegacyAccessTokenCookies()\n\n // Drop dead forget-password key\n try {\n window.sessionStorage?.removeItem('entredEmail')\n } catch {\n // ignore\n }\n}\n\n/** All client auth cookie names to remove on logout (canonical + legacy + configured). */\nexport function getClientAuthCookieNamesToClear(): string[] {\n const keys = getStorageKeys()\n const configured = [\n keys.loginDetails,\n keys.refreshToken,\n keys.portal,\n keys.subscriptionType,\n keys.authUser,\n keys.pagination,\n keys.routeMenu,\n keys.associationView,\n keys.emailVerified\n ].filter((name): name is string => Boolean(name))\n\n const canonical = [\n WP_STORAGE_KEYS.c.auth.login,\n WP_STORAGE_KEYS.c.auth.refresh,\n WP_STORAGE_KEYS.c.auth.portal,\n WP_STORAGE_KEYS.c.auth.sub,\n WP_STORAGE_KEYS.c.auth.emailOk,\n WP_STORAGE_KEYS.c.ui.pag,\n WP_STORAGE_KEYS.c.ui.menu,\n WP_STORAGE_KEYS.c.ui.assoc\n ]\n\n return [...new Set([...configured, ...canonical, ...LEGACY_CLIENT_AUTH_COOKIES])]\n}\n\nexport function clearClientSessionStorageKeys(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n for (const [legacy, canonical] of CLIENT_SESSION_STORAGE_MIGRATIONS) {\n if (\n canonical === WP_STORAGE_KEYS.c.login.email ||\n canonical === WP_STORAGE_KEYS.c.login.force ||\n canonical === WP_STORAGE_KEYS.c.login.passkey ||\n canonical === WP_STORAGE_KEYS.c.login.done\n ) {\n continue\n }\n window.sessionStorage.removeItem(legacy)\n window.sessionStorage.removeItem(canonical)\n }\n for (const key of LEGACY_CLIENT_SESSION_EXACT) {\n if (key === 'entredEmail') {\n window.sessionStorage.removeItem(key)\n }\n }\n const preservedLoginKeys = new Set([\n WP_STORAGE_KEYS.c.login.email,\n WP_STORAGE_KEYS.c.login.force,\n WP_STORAGE_KEYS.c.login.passkey,\n WP_STORAGE_KEYS.c.login.done,\n 'woodsportal.login.email',\n 'woodsportal.login.forcePreLogin',\n 'woodsportal.login.passkeyPrimaryEnrolled',\n 'woodsportal.login.preLoginCompletedKey'\n ])\n const keysToRemove: string[] = []\n for (let i = 0; i < window.sessionStorage.length; i++) {\n const key = window.sessionStorage.key(i)\n if (!key || preservedLoginKeys.has(key)) continue\n if (key.startsWith('woodsportal.mfa.') || key.startsWith('wp.c.mfa.')) {\n keysToRemove.push(key)\n }\n if (key === WP_STORAGE_KEYS.c.auth.err || key === WP_STORAGE_KEYS.c.auth.refreshExhausted || key === 'authError') {\n keysToRemove.push(key)\n }\n if (key === WP_STORAGE_KEYS.c.sso.cb || key === 'sso_callback_processed') {\n keysToRemove.push(key)\n }\n }\n keysToRemove.forEach((k) => window.sessionStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n\nexport function clearClientIframeRefreshLocalKeys(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const keys = Object.keys(window.localStorage).filter(\n (k) => k.startsWith('wp_iframe_rt_') || k.startsWith(WP_STORAGE_KEYS.c.auth.iframeRtPrefix)\n )\n keys.forEach((k) => window.localStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n\nexport function clearStaleIframeRefreshForOtherHubs(activeHubId: string | number | undefined): void {\n if (activeHubId == null || typeof window === 'undefined' || !window.localStorage) {\n return\n }\n const activePrefix = WP_STORAGE_KEYS.c.auth.iframeRtPrefix\n const activeKey = wpClientIframeRefreshKey(activeHubId)\n try {\n const keys = Object.keys(window.localStorage).filter(\n (k) => (k.startsWith('wp_iframe_rt_') || k.startsWith(activePrefix)) && k !== activeKey && k !== wpClientIframeRefreshExpKey(activeHubId)\n )\n keys.forEach((k) => window.localStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n"]}