@fluid-app/portal-sdk 0.1.71 → 0.1.72

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 (124) hide show
  1. package/dist/{AppDownloadScreen-BXWBVnQM.cjs → AppDownloadScreen-7TQv3Yqk.cjs} +2 -2
  2. package/dist/{AppDownloadScreen-BXWBVnQM.cjs.map → AppDownloadScreen-7TQv3Yqk.cjs.map} +1 -1
  3. package/dist/{AppDownloadScreen-BXS02LRb.mjs → AppDownloadScreen-BDkQYUYF.mjs} +2 -2
  4. package/dist/{AppDownloadScreen-BXS02LRb.mjs.map → AppDownloadScreen-BDkQYUYF.mjs.map} +1 -1
  5. package/dist/{AppDownloadScreen-BVrUR6lm.mjs → AppDownloadScreen-BRN8j8oq.mjs} +7 -7
  6. package/dist/{AppDownloadScreen-BtwySuUY.cjs → AppDownloadScreen-Bibphw78.cjs} +7 -7
  7. package/dist/{CarouselWidget-DgskhtDP.cjs → CarouselWidget-BFYntrZQ.cjs} +2 -2
  8. package/dist/{CarouselWidget-DgskhtDP.cjs.map → CarouselWidget-BFYntrZQ.cjs.map} +1 -1
  9. package/dist/{CarouselWidget-BGdjG-xz.mjs → CarouselWidget-Bt1qOfyr.mjs} +2 -2
  10. package/dist/{CarouselWidget-BGdjG-xz.mjs.map → CarouselWidget-Bt1qOfyr.mjs.map} +1 -1
  11. package/dist/{CarouselWidget-CC6ZQZ8e.cjs → CarouselWidget-xDuWJsf-.cjs} +2 -2
  12. package/dist/{ChartWidget-BdNpOMhz.cjs → ChartWidget-BS4O1EOU.cjs} +2 -2
  13. package/dist/{ChartWidget-DSaru9Bb.mjs → ChartWidget-Cl5tEkUp.mjs} +2 -2
  14. package/dist/{ChartWidget-DSaru9Bb.mjs.map → ChartWidget-Cl5tEkUp.mjs.map} +1 -1
  15. package/dist/{ChartWidget-CS600CjN.cjs → ChartWidget-Dj_Rjkb8.cjs} +2 -2
  16. package/dist/{ChartWidget-CS600CjN.cjs.map → ChartWidget-Dj_Rjkb8.cjs.map} +1 -1
  17. package/dist/{ContactsScreen-C_c2yy5J.cjs → ContactsScreen-BpWSKKkQ.cjs} +8 -8
  18. package/dist/{ContactsScreen-B3k1fVQx.cjs → ContactsScreen-BvykfPOl.cjs} +4 -4
  19. package/dist/{ContactsScreen-B3k1fVQx.cjs.map → ContactsScreen-BvykfPOl.cjs.map} +1 -1
  20. package/dist/{ContactsScreen-CH6u8cRi.mjs → ContactsScreen-DXmgTj5G.mjs} +4 -4
  21. package/dist/{ContactsScreen-CH6u8cRi.mjs.map → ContactsScreen-DXmgTj5G.mjs.map} +1 -1
  22. package/dist/{ContactsScreen-ruymx9Pi.mjs → ContactsScreen-Ds1Tde6r.mjs} +8 -8
  23. package/dist/{FluidProvider-uuu90TSG.mjs → FluidProvider-BMxf7_8j.mjs} +9 -9
  24. package/dist/{FluidProvider-uuu90TSG.mjs.map → FluidProvider-BMxf7_8j.mjs.map} +1 -1
  25. package/dist/{FluidProvider-SnHdl4ww.cjs → FluidProvider-Dqj1m2GK.cjs} +9 -9
  26. package/dist/{FluidProvider-SnHdl4ww.cjs.map → FluidProvider-Dqj1m2GK.cjs.map} +1 -1
  27. package/dist/{LinkWidget-Bvw5OZwU.cjs → LinkWidget-9g8PsB_X.cjs} +2 -2
  28. package/dist/{LinkWidget-Bvw5OZwU.cjs.map → LinkWidget-9g8PsB_X.cjs.map} +1 -1
  29. package/dist/{LinkWidget-hhWO8yWC.cjs → LinkWidget-A_eWNLdm.cjs} +2 -2
  30. package/dist/{LinkWidget-dwIVKZD0.mjs → LinkWidget-BSCD6Gnm.mjs} +2 -2
  31. package/dist/{LinkWidget-dwIVKZD0.mjs.map → LinkWidget-BSCD6Gnm.mjs.map} +1 -1
  32. package/dist/{MessagingScreen-CGS474IP.mjs → MessagingScreen-85gpbRSW.mjs} +8 -8
  33. package/dist/{MessagingScreen-C7xDqpLm.cjs → MessagingScreen-BsR-IDc3.cjs} +7 -7
  34. package/dist/{MessagingScreen-tFbOXFq4.mjs → MessagingScreen-DKOjEkb6.mjs} +5 -5
  35. package/dist/{MessagingScreen-tFbOXFq4.mjs.map → MessagingScreen-DKOjEkb6.mjs.map} +1 -1
  36. package/dist/{MessagingScreen-27HyrQ1V.cjs → MessagingScreen-xPClL7GU.cjs} +4 -4
  37. package/dist/{MessagingScreen-27HyrQ1V.cjs.map → MessagingScreen-xPClL7GU.cjs.map} +1 -1
  38. package/dist/{MySiteScreen-DR_xY95c.mjs → MySiteScreen-CCJYG1Dy.mjs} +3 -3
  39. package/dist/{MySiteScreen-DR_xY95c.mjs.map → MySiteScreen-CCJYG1Dy.mjs.map} +1 -1
  40. package/dist/{MySiteScreen-bUfo9RDR.mjs → MySiteScreen-DALAbAWu.mjs} +7 -7
  41. package/dist/{MySiteScreen-B_UnnWDX.cjs → MySiteScreen-DobLvICT.cjs} +7 -7
  42. package/dist/{MySiteScreen-C-cS0_qZ.cjs → MySiteScreen-m22db4Tc.cjs} +3 -3
  43. package/dist/{MySiteScreen-C-cS0_qZ.cjs.map → MySiteScreen-m22db4Tc.cjs.map} +1 -1
  44. package/dist/{OrdersScreen-OexJlI4Y.cjs → OrdersScreen-C0gj-cxi.cjs} +5 -5
  45. package/dist/{OrdersScreen-OexJlI4Y.cjs.map → OrdersScreen-C0gj-cxi.cjs.map} +1 -1
  46. package/dist/{OrdersScreen-CQzgIEa4.mjs → OrdersScreen-Ci6pbdBP.mjs} +5 -5
  47. package/dist/{OrdersScreen-CQzgIEa4.mjs.map → OrdersScreen-Ci6pbdBP.mjs.map} +1 -1
  48. package/dist/{OrdersScreen-CO9vm0Wj.mjs → OrdersScreen-CsQ8UEik.mjs} +8 -8
  49. package/dist/{OrdersScreen-JCVS__ag.cjs → OrdersScreen-h34Ai_ng.cjs} +8 -8
  50. package/dist/{ProductsScreen-BcM3LqsG.cjs → ProductsScreen-B2aWFjRn.cjs} +8 -8
  51. package/dist/{ProductsScreen-BgVl8GAm.cjs → ProductsScreen-CdpOBRnN.cjs} +4 -4
  52. package/dist/{ProductsScreen-BgVl8GAm.cjs.map → ProductsScreen-CdpOBRnN.cjs.map} +1 -1
  53. package/dist/{ProductsScreen-GOW8lxiN.mjs → ProductsScreen-DsR5ONUJ.mjs} +9 -9
  54. package/dist/{ProductsScreen-B0BsPJth.mjs → ProductsScreen-K7snFJkp.mjs} +4 -4
  55. package/dist/{ProductsScreen-B0BsPJth.mjs.map → ProductsScreen-K7snFJkp.mjs.map} +1 -1
  56. package/dist/{ProfileScreen-Tcqc5WfU.mjs → ProfileScreen-BFJYYi0q.mjs} +7 -7
  57. package/dist/{ProfileScreen-e-uj2ulO.cjs → ProfileScreen-B_3gfD_i.cjs} +7 -7
  58. package/dist/{ProfileScreen-DFM_r4T5.cjs → ProfileScreen-B_LAuEoi.cjs} +4 -4
  59. package/dist/{ProfileScreen-DFM_r4T5.cjs.map → ProfileScreen-B_LAuEoi.cjs.map} +1 -1
  60. package/dist/{ProfileScreen-pvpnY0cG.mjs → ProfileScreen-Cp4Mrgux.mjs} +4 -4
  61. package/dist/{ProfileScreen-pvpnY0cG.mjs.map → ProfileScreen-Cp4Mrgux.mjs.map} +1 -1
  62. package/dist/{ShareablesScreen-C7M_kGX9.cjs → ShareablesScreen-Bs1GSq4_.cjs} +4 -4
  63. package/dist/{ShareablesScreen-C7M_kGX9.cjs.map → ShareablesScreen-Bs1GSq4_.cjs.map} +1 -1
  64. package/dist/{ShareablesScreen-KFwyduqD.mjs → ShareablesScreen-CbJcwq6z.mjs} +9 -9
  65. package/dist/{ShareablesScreen-8rSANBth.cjs → ShareablesScreen-Dc62JyfM.cjs} +8 -8
  66. package/dist/{ShareablesScreen-SS9rcLym.mjs → ShareablesScreen-HrBPki3d.mjs} +4 -4
  67. package/dist/{ShareablesScreen-SS9rcLym.mjs.map → ShareablesScreen-HrBPki3d.mjs.map} +1 -1
  68. package/dist/{ShopScreen-XGC180Ts.mjs → ShopScreen-BHI08VYS.mjs} +5 -5
  69. package/dist/{ShopScreen-XGC180Ts.mjs.map → ShopScreen-BHI08VYS.mjs.map} +1 -1
  70. package/dist/{ShopScreen-CMkEtT1s.mjs → ShopScreen-D6v-JlCL.mjs} +7 -7
  71. package/dist/{ShopScreen-Bo9Bbpg8.cjs → ShopScreen-DenJE12S.cjs} +7 -7
  72. package/dist/{ShopScreen-D-1WO4sB.cjs → ShopScreen-uG4ymlNd.cjs} +5 -5
  73. package/dist/{ShopScreen-D-1WO4sB.cjs.map → ShopScreen-uG4ymlNd.cjs.map} +1 -1
  74. package/dist/{SubscriptionsScreen-Vn6EN634.cjs → SubscriptionsScreen-C5y5f-Y_.cjs} +5 -5
  75. package/dist/{SubscriptionsScreen-Vn6EN634.cjs.map → SubscriptionsScreen-C5y5f-Y_.cjs.map} +1 -1
  76. package/dist/{SubscriptionsScreen-50w7SgWX.mjs → SubscriptionsScreen-CYS7lSKa.mjs} +5 -5
  77. package/dist/{SubscriptionsScreen-50w7SgWX.mjs.map → SubscriptionsScreen-CYS7lSKa.mjs.map} +1 -1
  78. package/dist/{SubscriptionsScreen-BVLHc7-p.mjs → SubscriptionsScreen-D6DbzsKB.mjs} +8 -8
  79. package/dist/{SubscriptionsScreen-DKI17q_K.cjs → SubscriptionsScreen-x-hG5H0M.cjs} +8 -8
  80. package/dist/{TableWidget-CcPSLT0B.cjs → TableWidget-3f5y9RqX.cjs} +2 -2
  81. package/dist/{TableWidget-DjYabx1e.mjs → TableWidget-CWSQnNLl.mjs} +2 -2
  82. package/dist/{TableWidget-DjYabx1e.mjs.map → TableWidget-CWSQnNLl.mjs.map} +1 -1
  83. package/dist/{TableWidget-Cri6r5Yr.cjs → TableWidget-rYwoKBuC.cjs} +2 -2
  84. package/dist/{TableWidget-Cri6r5Yr.cjs.map → TableWidget-rYwoKBuC.cjs.map} +1 -1
  85. package/dist/{UpgradeScreen-BbP-0Pcg.cjs → UpgradeScreen-BwYEAmkp.cjs} +2 -2
  86. package/dist/{UpgradeScreen-BbP-0Pcg.cjs.map → UpgradeScreen-BwYEAmkp.cjs.map} +1 -1
  87. package/dist/{UpgradeScreen-D7LfdVSJ.mjs → UpgradeScreen-DwhybKwu.mjs} +2 -2
  88. package/dist/{UpgradeScreen-D7LfdVSJ.mjs.map → UpgradeScreen-DwhybKwu.mjs.map} +1 -1
  89. package/dist/{UpgradeScreen-DJKNVL-O.cjs → UpgradeScreen-Dzeu1jqQ.cjs} +2 -2
  90. package/dist/{es-CrIkZTQ3.mjs → es-BzmMF_gE.mjs} +2 -2
  91. package/dist/{es-CrIkZTQ3.mjs.map → es-BzmMF_gE.mjs.map} +1 -1
  92. package/dist/index.cjs +44 -44
  93. package/dist/index.mjs +45 -45
  94. package/dist/{order-detail-DkMYJvzl.mjs → order-detail-C8Qta7xt.mjs} +2 -2
  95. package/dist/{order-detail-DkMYJvzl.mjs.map → order-detail-C8Qta7xt.mjs.map} +1 -1
  96. package/dist/{order-detail-JVq0-ps1.cjs → order-detail-S0QZ8p5Z.cjs} +2 -2
  97. package/dist/{order-detail-JVq0-ps1.cjs.map → order-detail-S0QZ8p5Z.cjs.map} +1 -1
  98. package/dist/{src-Bh-9OV8i.mjs → src-BPlLx20V.mjs} +18 -18
  99. package/dist/src-BPlLx20V.mjs.map +1 -0
  100. package/dist/{src-D1poJLOQ.cjs → src-D6ED_OgR.cjs} +2 -2
  101. package/dist/{src-D1poJLOQ.cjs.map → src-D6ED_OgR.cjs.map} +1 -1
  102. package/dist/{src-CzK-t4_m.mjs → src-DQnYIQKC.mjs} +3 -3
  103. package/dist/{src-CzK-t4_m.mjs.map → src-DQnYIQKC.mjs.map} +1 -1
  104. package/dist/{src-DqIS-4ns.cjs → src-DdJSkS2k.cjs} +18 -18
  105. package/dist/src-DdJSkS2k.cjs.map +1 -0
  106. package/dist/{use-account-clients-Bem920_7.cjs → use-account-clients-DrWcf8IN.cjs} +2 -2
  107. package/dist/{use-account-clients-Bem920_7.cjs.map → use-account-clients-DrWcf8IN.cjs.map} +1 -1
  108. package/dist/{use-account-clients-FUcF1B-z.mjs → use-account-clients-iJVMmnbv.mjs} +2 -2
  109. package/dist/{use-account-clients-FUcF1B-z.mjs.map → use-account-clients-iJVMmnbv.mjs.map} +1 -1
  110. package/dist/{use-current-user-Bld9wMVT.cjs → use-current-user-B-pNBKKk.cjs} +3 -3
  111. package/dist/{use-current-user-Bld9wMVT.cjs.map → use-current-user-B-pNBKKk.cjs.map} +1 -1
  112. package/dist/{use-current-user-DnBpWIw6.mjs → use-current-user-C52Qw6if.mjs} +3 -3
  113. package/dist/{use-current-user-DnBpWIw6.mjs.map → use-current-user-C52Qw6if.mjs.map} +1 -1
  114. package/dist/{use-customer-account-Rm2QXJiZ.cjs → use-customer-account-BWhY4Tam.cjs} +3 -3
  115. package/dist/{use-customer-account-Rm2QXJiZ.cjs.map → use-customer-account-BWhY4Tam.cjs.map} +1 -1
  116. package/dist/{use-customer-account-Dix8Ja5O.mjs → use-customer-account-C9_Xb6x-.mjs} +3 -3
  117. package/dist/{use-customer-account-Dix8Ja5O.mjs.map → use-customer-account-C9_Xb6x-.mjs.map} +1 -1
  118. package/dist/{use-fluid-api-CedscoxF.mjs → use-fluid-api-Cvx_ADUR.mjs} +2 -2
  119. package/dist/{use-fluid-api-CedscoxF.mjs.map → use-fluid-api-Cvx_ADUR.mjs.map} +1 -1
  120. package/dist/{use-fluid-api-DyI6LDsV.cjs → use-fluid-api-Ip5de2vH.cjs} +2 -2
  121. package/dist/{use-fluid-api-DyI6LDsV.cjs.map → use-fluid-api-Ip5de2vH.cjs.map} +1 -1
  122. package/package.json +15 -15
  123. package/dist/src-Bh-9OV8i.mjs.map +0 -1
  124. package/dist/src-DqIS-4ns.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FluidProvider-uuu90TSG.mjs","names":["ApiError","#provider","encode","decode","crypto","decode","importJWK","decodeBase64URL","asKeyObject","jwk.isJWK","jwk.isSecretJWK","isKeyLike","invalidKeyInput","jwk.isPrivateJWK","jwk.isPublicJWK","normalize","invalidKeyInput","crypto","getVerifyKey","subtleAlgorithm","crypto","base64url","secs","epoch","jwtPayload","base64url.encode","base64url.decode","base64url","fluidOs.getFluidOSManifest","createFluidPayFetchClient","customersApi.fetchCustomerAccount"],"sources":["../../../platform/api-client-core/src/fetch-client.ts","../../../fluid-pay/api-client/src/namespaces/customers.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/utils.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../../node_modules/.pnpm/@tanstack+query-persist-client-core@5.91.11/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js","../../../platform/query-persister/src/persister.ts","../../../api-clients/fluidos/src/namespaces/fluid_os.ts","../src/client/types.ts","../../../platform/auth/src/types.ts","../../../platform/auth/src/constants.ts","../../../platform/auth/src/browser-utils.ts","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/webcrypto.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/buffer_utils.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/errors.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/crypto_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/invalid_key_input.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/is_key_like.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_disjoint.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_object.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/check_key_length.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_jwk.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/jwk_to_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/normalize_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/key/import.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/check_key_type.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_crit.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_algorithms.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/subtle_dsa.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/flattened/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/compact/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/epoch.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/secs.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/jwt_claims_set.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwt/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/local.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/fetch_jwks.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/remote.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/decode_jwt.js","../../../platform/auth/src/token-utils.ts","../../../platform/auth/src/token-storage.ts","../../../platform/auth/src/url-token.ts","../../../platform/auth/src/dev-utils.ts","../../../platform/auth/src/company-switch.ts","../../../platform/auth/src/auth-redirect.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/client/fluid-client.ts","../src/themes/index.ts","../src/providers/FluidThemeProvider.tsx","../src/providers/FluidAuthProvider.tsx","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx"],"sourcesContent":["/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\nexport interface FetchClientInstance {\n request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n requestWithFormData: <TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n },\n ) => Promise<TResponse>;\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(\n config: FetchClientConfig,\n): FetchClientInstance {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n // Read body as text first to avoid SyntaxError from response.json()\n // when server returns non-JSON bodies with application/json content-type.\n const errorText = await response.text().catch(() => \"\");\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(errorText);\n } catch {\n throw new ApiError(\n errorText.slice(0, 200) ||\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n const msg = (data.message || data.error_message) as string | undefined;\n throw new ApiError(\n msg || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request: request,\n requestWithFormData: requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = FetchClientInstance;\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch the current customer's account info.\n * Endpoint: GET /fluid_pay/me?jwt={jwt}\n */\nexport async function fetchCustomerAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAccount> {\n return client.get(`/fluid_pay/me`, { jwt });\n}\n\n/**\n * Update customer profile (name, phone, language).\n * Endpoint: PATCH /fluid_pay/update_me?jwt={jwt}\n */\nexport async function updateCustomer(\n client: FetchClient,\n jwt: string,\n body: fluidPay.UpdateCustomerBody,\n): Promise<fluidPay.FluidPayAccountResponse> {\n return client.patch(`/fluid_pay/update_me?jwt=${jwt}`, {\n fluid_pay_account: body,\n });\n}\n","// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveEnabled(enabled, query) {\n return typeof enabled === \"function\" ? enabled(query) : enabled;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b) {\n if (a === b) {\n return a;\n }\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nexport {\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/createPersister.ts\nimport {\n hashKey,\n matchQuery,\n notifyManager,\n partialMatchKey\n} from \"@tanstack/query-core\";\nvar PERSISTER_KEY_PREFIX = \"tanstack-query\";\nfunction experimental_createQueryPersister({\n storage,\n buster = \"\",\n maxAge = 1e3 * 60 * 60 * 24,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n prefix = PERSISTER_KEY_PREFIX,\n refetchOnRestore = true,\n filters\n}) {\n function isExpiredOrBusted(persistedQuery) {\n if (persistedQuery.state.dataUpdatedAt) {\n const queryAge = Date.now() - persistedQuery.state.dataUpdatedAt;\n const expired = queryAge > maxAge;\n const busted = persistedQuery.buster !== buster;\n if (expired || busted) {\n return true;\n }\n return false;\n }\n return true;\n }\n async function retrieveQuery(queryHash, afterRestoreMacroTask) {\n if (storage != null) {\n const storageKey = `${prefix}-${queryHash}`;\n try {\n const storedData = await storage.getItem(storageKey);\n if (storedData) {\n const persistedQuery = await deserialize(storedData);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(storageKey);\n } else {\n if (afterRestoreMacroTask) {\n notifyManager.schedule(\n () => afterRestoreMacroTask(persistedQuery)\n );\n }\n return persistedQuery.state.data;\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(err);\n console.warn(\n \"Encountered an error attempting to restore query cache from persisted location.\"\n );\n }\n await storage.removeItem(storageKey);\n }\n }\n return;\n }\n async function persistQueryByKey(queryKey, queryClient) {\n if (storage != null) {\n const query = queryClient.getQueryCache().find({ queryKey });\n if (query) {\n await persistQuery(query);\n } else {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n \"Could not find query to be persisted. QueryKey:\",\n JSON.stringify(queryKey)\n );\n }\n }\n }\n }\n async function persistQuery(query) {\n if (storage != null) {\n const storageKey = `${prefix}-${query.queryHash}`;\n storage.setItem(\n storageKey,\n await serialize({\n state: query.state,\n queryKey: query.queryKey,\n queryHash: query.queryHash,\n buster\n })\n );\n }\n }\n async function persisterFn(queryFn, ctx, query) {\n const matchesFilter = filters ? matchQuery(filters, query) : true;\n if (matchesFilter && query.state.data === void 0 && storage != null) {\n const restoredData = await retrieveQuery(\n query.queryHash,\n (persistedQuery) => {\n query.setState({\n dataUpdatedAt: persistedQuery.state.dataUpdatedAt,\n errorUpdatedAt: persistedQuery.state.errorUpdatedAt\n });\n if (refetchOnRestore === \"always\" || refetchOnRestore === true && query.isStale()) {\n query.fetch();\n }\n }\n );\n if (restoredData !== void 0) {\n return Promise.resolve(restoredData);\n }\n }\n const queryFnResult = await queryFn(ctx);\n if (matchesFilter && storage != null) {\n notifyManager.schedule(() => {\n persistQuery(query);\n });\n }\n return Promise.resolve(queryFnResult);\n }\n async function persisterGc() {\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n }\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Garbage collection is not possible without ability to iterate over storage items.\"\n );\n }\n }\n async function restoreQueries(queryClient, filters2 = {}) {\n const { exact, queryKey } = filters2;\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n continue;\n }\n if (queryKey) {\n if (exact) {\n if (persistedQuery.queryHash !== hashKey(queryKey)) {\n continue;\n }\n } else if (!partialMatchKey(persistedQuery.queryKey, queryKey)) {\n continue;\n }\n }\n queryClient.setQueryData(\n persistedQuery.queryKey,\n persistedQuery.state.data,\n {\n updatedAt: persistedQuery.state.dataUpdatedAt\n }\n );\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Restoration of all stored entries is not possible without ability to iterate over storage items.\"\n );\n }\n }\n return {\n persisterFn,\n persistQuery,\n persistQueryByKey,\n retrieveQuery,\n persisterGc,\n restoreQueries\n };\n}\nexport {\n PERSISTER_KEY_PREFIX,\n experimental_createQueryPersister\n};\n//# sourceMappingURL=createPersister.js.map","import {\n type AsyncStorage,\n experimental_createQueryPersister,\n type PersistedQuery,\n} from \"@tanstack/react-query-persist-client\";\n\nconst DB_NAME = \"fluid_tanstack_query_cache\";\nconst STORE_NAME = \"fluid_queries\";\nconst VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\n// Exported for testing - allows resetting internal state between tests\nexport function _resetForTesting(): void {\n dbPromise = null;\n}\n\nexport async function deleteDatabase(reason: string = \"error\"): Promise<void> {\n return new Promise((resolve, reject) => {\n console.warn(`[IDB] Deleting database due to ${reason}`);\n const req = indexedDB.deleteDatabase(DB_NAME);\n req.onsuccess = () => {\n console.log(\"[IDB] Database deleted successfully\");\n dbPromise = null; // ensure next getDb() opens a fresh connection\n resolve();\n };\n req.onerror = () => {\n console.error(\"[IDB] Failed to delete database:\", req.error);\n reject(req.error ?? new Error(\"deleteDatabase failed\"));\n };\n req.onblocked = () => {\n console.warn(\"[IDB] Delete blocked: close all tabs using this database\");\n // Resolve anyway so callers (e.g. clearCompanyCache) don't hang\n // indefinitely. The delete will complete once blocking connections close.\n dbPromise = null; // best-effort: allow fresh open on next access\n resolve();\n };\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, VERSION);\n\n req.onupgradeneeded = () => {\n const upgradeDb = req.result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const conn = req.result;\n conn.onversionchange = () => {\n console.trace(\"[IDB] version change – closing connection\");\n conn.close();\n // clear the cached promise so the next getDb call re-opens a connection\n dbPromise = null;\n };\n resolve(conn);\n };\n\n req.onblocked = () => {\n console.warn(\"[IDB] open blocked: another connection is holding the DB\");\n };\n\n req.onerror = () => {\n reject(\n req.error instanceof Error\n ? req.error\n : new Error(`IndexedDB open failed: ${String(req.error)}`),\n );\n };\n });\n}\n\nasync function getDbWithRecovery(): Promise<IDBDatabase> {\n try {\n return await openDatabase();\n } catch (err) {\n // First open failed - try to delete and recreate\n console.warn(\"[IDB] Initial open failed, attempting recovery:\", err);\n try {\n await deleteDatabase();\n console.log(\"[IDB] Retrying database open after deletion\");\n return await openDatabase();\n } catch (retryErr) {\n console.error(\"[IDB] Recovery failed:\", retryErr);\n throw retryErr;\n }\n }\n}\n\nfunction getDb(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise;\n\n // Create the promise and cache it immediately to prevent race conditions\n // All concurrent calls will share this same promise\n dbPromise = getDbWithRecovery().catch((err) => {\n // On failure, clear the cache so next call can retry fresh\n dbPromise = null;\n throw err;\n });\n\n return dbPromise;\n}\n\n// Exported for testing - allows direct testing of storage operations\nexport const storage: AsyncStorage<PersistedQuery> = {\n async getItem(key: string) {\n try {\n const db = await getDb();\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n // Transaction creation failed (e.g., stale connection)\n console.trace(\"[IDB] getItem transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] getItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem retry error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n console.trace(\"[IDB] getItem retry transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] getItem recovery failed:\", recoveryErr);\n }\n return undefined;\n }\n },\n\n async setItem(key: string, value: PersistedQuery) {\n // JSON round-trip strips non-cloneable properties (functions, class instances)\n // before IndexedDB's structured clone algorithm runs. Without this, IDB\n // throws DataCloneError. Theme Color objects are now kept out of the cache\n // via the select pattern, but other queries may still have non-cloneable data.\n const cloneableValue = JSON.parse(JSON.stringify(value));\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] setItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] setItem recovery failed:\", recoveryErr);\n }\n }\n },\n\n async removeItem(key: string) {\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] removeItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] removeItem recovery failed:\", recoveryErr);\n }\n }\n },\n};\n\n// Factory function to create persister - only call this client-side\nexport function createPersister(): ReturnType<\n typeof experimental_createQueryPersister\n> {\n return experimental_createQueryPersister<PersistedQuery>({\n storage,\n serialize: (persistedQuery) => persistedQuery,\n deserialize: (cached) => cached,\n });\n}\n","/**\n * Generated API client functions for fluid_os\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/fluid_os\";\n\n// ============================================================================\n// Fluid OS - Definitions\n// ============================================================================\n\n/**\n * List Fluid OS definitions\n * Retrieve a list of Fluid OS definitions for the current company\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listFluidOSDefinitions(\n client: FetchClient,\n params?: operations[\"listFluidOSDefinitions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSDefinitions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions`, params);\n}\n\n/**\n * Create a Fluid OS definition\n * Create a new Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createFluidOSDefinition(\n client: FetchClient,\n body: operations[\"createFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/fluid_os/definitions`, body);\n}\n\n/**\n * Get a Fluid OS definition\n * Retrieve a specific Fluid OS definition with all associations\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions/${id}`);\n}\n\n/**\n * Update a Fluid OS definition\n * Update an existing Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/company/fluid_os/definitions/${id}`, body);\n}\n\n/**\n * Delete a Fluid OS definition\n * Delete a Definition\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/fluid_os/definitions/${id}`);\n}\n\n// ============================================================================\n// Fluid OS - Navigation Items\n// ============================================================================\n\n/**\n * List navigation items for a navigation\n * Retrieve a list of navigation items for a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n */\nexport async function listFluidOSNavigationItems(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n): Promise<\n operations[\"listFluidOSNavigationItems\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n );\n}\n\n/**\n * Create a navigation item\n * Create a new navigation item for a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param body - body\n */\nexport async function createFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n body: operations[\"createFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n body,\n );\n}\n\n/**\n * Get a specific navigation item\n * Retrieve a specific navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function getFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n/**\n * Update a navigation item\n * Update an existing navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation item\n * Delete a navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Navigations\n// ============================================================================\n\n/**\n * List navigations for a Fluid OS definition\n * Retrieve a list of navigations for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSNavigations(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSNavigations\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSNavigations\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n params,\n );\n}\n\n/**\n * Create a navigation for a Fluid OS definition\n * Create a new navigation for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n body,\n );\n}\n\n/**\n * Get a specific navigation\n * Retrieve a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n/**\n * Update a navigation\n * Update an existing navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation\n * Delete a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Profiles\n// ============================================================================\n\n/**\n * List profiles for a Fluid OS definition\n * Retrieve a list of profiles for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSProfiles(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSProfiles\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSProfiles\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n params,\n );\n}\n\n/**\n * Create a profile for a Fluid OS definition\n * Create a new profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n body,\n );\n}\n\n/**\n * Get the default profile\n * Retrieve the default profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function getDefaultFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"getDefaultFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/default`,\n );\n}\n\n/**\n * Get a specific profile\n * Retrieve a specific profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n/**\n * Update a profile\n * Update an existing profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n body,\n );\n}\n\n/**\n * Delete a profile\n * Delete a profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Public\n// ============================================================================\n\n/**\n * Get active Fluid OS definition\n * Retrieve the active Fluid OS definition manifest for a specific platform\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function getFluidOSManifest(\n client: FetchClient,\n params: operations[\"getFluidOSManifest\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getFluidOSManifest\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/fluid_os/definitions/active`, params);\n}\n\n// ============================================================================\n// Fluid OS - Screens\n// ============================================================================\n\n/**\n * List screens for a Fluid OS definition\n * Retrieve a list of screens for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSScreens(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSScreens\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSScreens\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n params,\n );\n}\n\n/**\n * Create a screen for a Fluid OS definition\n * Create a new screen for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n body,\n );\n}\n\n/**\n * Get a specific screen\n * Retrieve a specific screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n/**\n * Update a screen\n * Update an existing screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n body,\n );\n}\n\n/**\n * Delete a screen\n * Delete a screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Themes\n// ============================================================================\n\n/**\n * List themes for a Fluid OS definition\n * Retrieve a list of themes for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSThemes(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSThemes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSThemes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n params,\n );\n}\n\n/**\n * Create a theme for a Fluid OS definition\n * Create a new theme for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n body,\n );\n}\n\n/**\n * Get a specific theme\n * Retrieve a specific theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n/**\n * Update a theme\n * Update an existing theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n body,\n );\n}\n\n/**\n * Delete a theme\n * Delete a theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Versions\n// ============================================================================\n\n/**\n * List versions for a Fluid OS definition\n * Retrieve a list of published versions for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSVersions(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSVersions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSVersions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n params,\n );\n}\n\n/**\n * Publish a new version of a Fluid OS definition\n * Publish a new version of the Fluid OS definition. This creates a snapshot of the current definition state including all screens, profiles, themes, and navigations. No request body is required - the manifest is built automatically from the current definition state.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function createFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"createFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n );\n}\n\n/**\n * Get a specific version\n * Retrieve a specific published version including its manifest\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n );\n}\n\n/**\n * Update a version\n * Update a version. Currently only supports activating/deactivating a version.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSVersion\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n body,\n );\n}\n","// ============================================================================\n// HTTP Method Constants\n// ============================================================================\n\n/**\n * HTTP methods supported by the API client.\n * Use `as const` for literal type inference and type safety.\n */\nexport const HTTP_METHODS = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n PATCH: \"PATCH\",\n DELETE: \"DELETE\",\n} as const;\n\n/**\n * Union type of all supported HTTP methods.\n * Derived from HTTP_METHODS constant to avoid duplication.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[keyof typeof HTTP_METHODS];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Fluid SDK client.\n * Use Readonly<FluidSDKConfig> when the config should not be modified after creation.\n */\nexport interface FluidSDKConfig {\n /**\n * Base URL for the Fluid API domain (e.g., \"https://api.fluid.app\").\n * Endpoints include their full path from root (e.g., \"/api/me\").\n */\n readonly baseUrl: string;\n\n /**\n * Function to retrieve the authentication token\n * Return null/undefined if no token is available\n */\n readonly getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Callback invoked when a 401 authentication error occurs\n * Use this to trigger re-authentication flows\n */\n readonly onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"portal\" }\n */\n readonly defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Filestack API key for messaging file uploads.\n * If not provided, file attachments will be disabled in the messaging composer.\n */\n readonly filestackApiKey?: string;\n\n /**\n * Override WebSocket URL for real-time messaging.\n * Default: derived from baseUrl by replacing trailing /api with /cable\n */\n readonly websocketUrl?: string;\n\n /**\n * ISO country code for the store/merchant (e.g., \"US\", \"CA\", \"GB\").\n * Used to fetch country-specific payment methods.\n * @default \"US\"\n */\n readonly countryIso?: string;\n}\n\n/**\n * Options for individual API requests.\n * Uses HttpMethod type for method to ensure type safety.\n */\nexport interface RequestOptions {\n readonly method?: HttpMethod;\n readonly body?: unknown;\n readonly params?: Readonly<Record<string, unknown>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\n/**\n * Pagination parameters for list endpoints\n */\nexport interface PaginationParams {\n readonly page?: number;\n readonly per_page?: number;\n}\n\n// ============================================================================\n// Sort Order - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * Sort order constant - single source of truth for sort direction values.\n * Use SORT_ORDERS.asc instead of \"asc\" for type-safe comparisons.\n */\nexport const SORT_ORDERS = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\n/**\n * Union type of sort order values, derived from SORT_ORDERS constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type SortOrder = (typeof SORT_ORDERS)[keyof typeof SORT_ORDERS];\n\n/**\n * Common filter parameters for list endpoints\n */\nexport interface BaseListParams extends PaginationParams {\n readonly sort_by?: string;\n readonly sort_order?: SortOrder;\n readonly search?: string;\n}\n","/**\n * Auth Types\n *\n * These types define the JWT payload structure and authentication\n * configuration options.\n */\n\n// ============================================================================\n// User Types - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * User type constant - single source of truth for user role values.\n * Use USER_TYPES.admin instead of \"admin\" for type-safe comparisons.\n */\nexport const USER_TYPES = {\n admin: \"admin\",\n rep: \"rep\",\n root_admin: \"root_admin\",\n customer: \"customer\",\n} as const;\n\n/**\n * Union type of all user types, derived from USER_TYPES constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type UserType = (typeof USER_TYPES)[keyof typeof USER_TYPES];\n\n/**\n * Runtime validation for user types.\n * @param value - The value to check\n * @returns true if value is a valid UserType\n */\nexport function isUserType(value: string): value is UserType {\n return Object.values(USER_TYPES).includes(value as UserType);\n}\n\n/**\n * JWT payload structure from Fluid Commerce authentication.\n * Contains user identity and role information.\n */\nexport interface JWTPayload {\n /** User ID */\n id?: number | undefined;\n /** User email address */\n email?: string | undefined;\n /** Full name of the user */\n full_name?: string | undefined;\n /** User role type */\n user_type: UserType;\n /** Original user type (for impersonation scenarios) */\n og_user_type?: UserType | undefined;\n /** Company ID the user belongs to */\n company_id?: number | undefined;\n /** Token expiration timestamp (Unix seconds) */\n exp?: number | undefined;\n /** Authentication type (e.g., \"standard\", \"impersonation\") */\n auth_type?: string | undefined;\n}\n\n/**\n * Configuration options for FluidAuthProvider.\n * All options have sensible defaults.\n */\nexport interface FluidAuthConfig {\n /**\n * URL parameter name for the auth token.\n * @default \"fluidUserToken\"\n */\n tokenKey?: string;\n\n /**\n * Cookie name for storing the auth token.\n * @default \"auth_token\"\n */\n cookieKey?: string;\n\n /**\n * Cookie max age in seconds.\n * @default 777600 (9 days)\n */\n cookieMaxAge?: number;\n\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration.\n * @default 30000 (30 seconds)\n */\n gracePeriodMs?: number;\n\n /**\n * Callback invoked when authentication fails (no valid token).\n * When omitted, the SDK redirects to `authUrl` with the current URL\n * as a redirect parameter so users can log in and return.\n */\n onAuthFailure?: () => void;\n\n /**\n * Base URL for the authentication page.\n * Used by the default auth failure redirect when `onAuthFailure` is not provided.\n * Ignored when a custom `onAuthFailure` callback is set.\n * @default \"https://auth.fluid.app\"\n */\n authUrl?: string;\n\n /**\n * Enable dev-mode auth bypass.\n * When true AND running in Vite dev mode (import.meta.env.DEV),\n * auth will use a synthetic mock user instead of requiring a real JWT.\n * The mock user allows UI rendering but API calls will fail (token is null).\n * @default false\n */\n devBypass?: boolean;\n\n /**\n * JWKS (JSON Web Key Set) URL for signature verification.\n * When provided, JWT signatures will be verified against keys\n * from this endpoint before accepting the token.\n *\n * This provides defense-in-depth client-side verification.\n * Without this, tokens are only decoded (not verified) client-side,\n * and real verification happens server-side on API calls.\n *\n * @example \"https://api.fluid.app/.well-known/jwks.json\"\n */\n jwksUrl?: string;\n}\n\n/**\n * Value provided by the FluidAuthContext.\n * All properties are readonly since context values should not be mutated by consumers.\n */\nexport interface FluidAuthContextValue {\n /** Whether the user is authenticated with a valid token */\n readonly isAuthenticated: boolean;\n /** Whether authentication is still being initialized */\n readonly isLoading: boolean;\n /** Decoded JWT payload if authenticated, null otherwise */\n readonly user: JWTPayload | null;\n /** Raw JWT token string if authenticated, null otherwise */\n readonly token: string | null;\n /** Clear authentication state and stored tokens */\n readonly clearAuth: () => void;\n /** Authentication error if any occurred during initialization */\n readonly error: Error | null;\n}\n\n/**\n * Result of token validation.\n * Uses a discriminated union for type-safe handling of valid/invalid states.\n */\nexport type TokenValidationResult =\n | {\n /** Token is valid */\n isValid: true;\n /** Decoded JWT payload */\n payload: JWTPayload;\n /** No error when valid */\n error?: undefined;\n }\n | {\n /** Token is invalid */\n isValid: false;\n /** Decoded JWT payload if parseable but expired */\n payload?: JWTPayload;\n /** Error message explaining why validation failed */\n error: string;\n };\n","/**\n * Auth Constants\n *\n * These constants define the default values for authentication\n * configuration and storage keys.\n */\n\n/**\n * Authentication-related constants with sensible defaults.\n */\nexport const AUTH_CONSTANTS = {\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration. Tokens are considered valid\n * if they expire within this period.\n */\n TOKEN_GRACE_PERIOD_MS: 30_000, // 30 seconds\n\n /**\n * Default cookie max age in seconds (9 days).\n * This matches the typical JWT token lifetime from the Fluid API.\n */\n COOKIE_MAX_AGE: 777_600, // 9 days in seconds (9 * 24 * 60 * 60)\n} as const;\n\n/**\n * Storage keys for auth tokens.\n */\nexport const STORAGE_KEYS = {\n /** localStorage key for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** localStorage key for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n /** Cookie name for auth token */\n AUTH_COOKIE: \"auth_token\",\n} as const;\n\n/**\n * Default URL parameter names for token extraction.\n */\nexport const URL_PARAMS = {\n /** URL parameter name for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** URL parameter name for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n} as const;\n","/**\n * Browser environment detection utility.\n * Shared across auth modules to avoid duplication.\n */\n\n/**\n * Check if we're running in a browser environment.\n * Checks both `window` and `document` to ensure full DOM availability.\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n","export default crypto;\nexport const isCryptoKey = (key) => key instanceof CryptoKey;\n","import digest from '../runtime/digest.js';\nexport const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nexport function p2s(alg, p2sInput) {\n return concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function lengthAndInput(input) {\n return concat(uint32be(input.length), input);\n}\nexport async function concatKdf(secret, bits, value) {\n const iterations = Math.ceil((bits >> 3) / 32);\n const res = new Uint8Array(iterations * 32);\n for (let iter = 0; iter < iterations; iter++) {\n const buf = new Uint8Array(4 + secret.length + value.length);\n buf.set(uint32be(iter + 1));\n buf.set(secret, 4);\n buf.set(value, 4 + secret.length);\n res.set(await digest('sha256', buf), iter * 32);\n }\n return res.slice(0, bits >> 3);\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nexport const encodeBase64 = (input) => {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < unencoded.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, unencoded.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n};\nexport const encode = (input) => {\n return encodeBase64(input).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\nexport const decodeBase64 = (encoded) => {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n};\nexport const decode = (input) => {\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n};\n","export class JOSEError extends Error {\n constructor(message, options) {\n super(message, options);\n this.code = 'ERR_JOSE_GENERIC';\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nJOSEError.code = 'ERR_JOSE_GENERIC';\nexport class JWTClaimValidationFailed extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTClaimValidationFailed.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\nexport class JWTExpired extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_EXPIRED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTExpired.code = 'ERR_JWT_EXPIRED';\nexport class JOSEAlgNotAllowed extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n }\n}\nJOSEAlgNotAllowed.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\nexport class JOSENotSupported extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_NOT_SUPPORTED';\n }\n}\nJOSENotSupported.code = 'ERR_JOSE_NOT_SUPPORTED';\nexport class JWEDecryptionFailed extends JOSEError {\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n this.code = 'ERR_JWE_DECRYPTION_FAILED';\n }\n}\nJWEDecryptionFailed.code = 'ERR_JWE_DECRYPTION_FAILED';\nexport class JWEInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWE_INVALID';\n }\n}\nJWEInvalid.code = 'ERR_JWE_INVALID';\nexport class JWSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWS_INVALID';\n }\n}\nJWSInvalid.code = 'ERR_JWS_INVALID';\nexport class JWTInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWT_INVALID';\n }\n}\nJWTInvalid.code = 'ERR_JWT_INVALID';\nexport class JWKInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWK_INVALID';\n }\n}\nJWKInvalid.code = 'ERR_JWK_INVALID';\nexport class JWKSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWKS_INVALID';\n }\n}\nJWKSInvalid.code = 'ERR_JWKS_INVALID';\nexport class JWKSNoMatchingKey extends JOSEError {\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_NO_MATCHING_KEY';\n }\n}\nJWKSNoMatchingKey.code = 'ERR_JWKS_NO_MATCHING_KEY';\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n }\n}\nSymbol.asyncIterator;\nJWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\nexport class JWKSTimeout extends JOSEError {\n constructor(message = 'request timed out', options) {\n super(message, options);\n this.code = 'ERR_JWKS_TIMEOUT';\n }\n}\nJWKSTimeout.code = 'ERR_JWKS_TIMEOUT';\nexport class JWSSignatureVerificationFailed extends JOSEError {\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n this.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n }\n}\nJWSSignatureVerificationFailed.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n","function unusable(name, prop = 'algorithm.name') {\n return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\n}\nfunction isAlgorithm(algorithm, name) {\n return algorithm.name === name;\n}\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usages) {\n if (usages.length && !usages.some((expected) => key.usages.includes(expected))) {\n let msg = 'CryptoKey does not support this operation, its usages must include ';\n if (usages.length > 2) {\n const last = usages.pop();\n msg += `one of ${usages.join(', ')}, or ${last}.`;\n }\n else if (usages.length === 2) {\n msg += `one of ${usages[0]} or ${usages[1]}.`;\n }\n else {\n msg += `${usages[0]}.`;\n }\n throw new TypeError(msg);\n }\n}\nexport function checkSigCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'EdDSA': {\n if (key.algorithm.name !== 'Ed25519' && key.algorithm.name !== 'Ed448') {\n throw unusable('Ed25519 or Ed448');\n }\n break;\n }\n case 'Ed25519': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\nexport function checkEncCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n case 'X448':\n break;\n default:\n throw unusable('ECDH, X25519, or X448');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport default (actual, ...types) => {\n return message('Key must be ', actual, ...types);\n};\nexport function withAlg(alg, actual, ...types) {\n return message(`Key for the ${alg} algorithm must be `, actual, ...types);\n}\n","import { isCryptoKey } from './webcrypto.js';\nexport default (key) => {\n if (isCryptoKey(key)) {\n return true;\n }\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nexport const types = ['CryptoKey'];\n","const isDisjoint = (...headers) => {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n};\nexport default isDisjoint;\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\n","export default (alg, key) => {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n};\n","import isObject from './is_object.js';\nexport function isJWK(key) {\n return isObject(key) && typeof key.kty === 'string';\n}\nexport function isPrivateJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'string';\n}\nexport function isPublicJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'undefined';\n}\nexport function isSecretJWK(key) {\n return isJWK(key) && key.kty === 'oct' && typeof key.k === 'string';\n}\n","import crypto from './webcrypto.js';\nimport { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'EdDSA':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nconst parse = async (jwk) => {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const rest = [\n algorithm,\n jwk.ext ?? false,\n jwk.key_ops ?? keyUsages,\n ];\n const keyData = { ...jwk };\n delete keyData.alg;\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, ...rest);\n};\nexport default parse;\n","import { isJWK } from '../lib/is_jwk.js';\nimport { decode } from './base64url.js';\nimport importJWK from './jwk_to_key.js';\nconst exportKeyValue = (k) => decode(k);\nlet privCache;\nlet pubCache;\nconst isKeyObject = (key) => {\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nconst importAndCache = async (cache, key, jwk, alg, freeze = false) => {\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await importJWK({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst normalizePublicKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n delete jwk.d;\n delete jwk.dp;\n delete jwk.dq;\n delete jwk.p;\n delete jwk.q;\n delete jwk.qi;\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n pubCache || (pubCache = new WeakMap());\n return importAndCache(pubCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n pubCache || (pubCache = new WeakMap());\n const cryptoKey = importAndCache(pubCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nconst normalizePrivateKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n privCache || (privCache = new WeakMap());\n return importAndCache(privCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n privCache || (privCache = new WeakMap());\n const cryptoKey = importAndCache(privCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nexport default { normalizePublicKey, normalizePrivateKey };\n","import { decode as decodeBase64URL } from '../runtime/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../runtime/asn1.js';\nimport asKeyObject from '../runtime/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n alg || (alg = jwk.alg);\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n case 'EC':\n case 'OKP':\n return asKeyObject({ ...jwk, alg });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport isKeyLike, { types } from '../runtime/is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined && key.use !== 'sig') {\n throw new TypeError('Invalid key for this operation, when present its use must be sig');\n }\n if (key.key_ops !== undefined && key.key_ops.includes?.(usage) !== true) {\n throw new TypeError(`Invalid key for this operation, when present its key_ops must include ${usage}`);\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, when present its alg must be ${alg}`);\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (key instanceof Uint8Array)\n return;\n if (allowJwk && jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, 'Uint8Array', allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (allowJwk && jwk.isJWK(key)) {\n switch (usage) {\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a private JWK`);\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (usage === 'sign' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n }\n if (usage === 'decrypt' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n if (key.algorithm && usage === 'verify' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n }\n if (key.algorithm && usage === 'encrypt' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n};\nfunction checkKeyType(allowJwk, alg, key, usage) {\n const symmetric = alg.startsWith('HS') ||\n alg === 'dir' ||\n alg.startsWith('PBES2') ||\n /^A\\d{3}(?:GCM)?KW$/.test(alg);\n if (symmetric) {\n symmetricTypeCheck(alg, key, usage, allowJwk);\n }\n else {\n asymmetricTypeCheck(alg, key, usage, allowJwk);\n }\n}\nexport default checkKeyType.bind(undefined, false);\nexport const checkKeyTypeWithJwk = checkKeyType.bind(undefined, true);\n","import { JOSENotSupported } from '../util/errors.js';\nfunction validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\nexport default validateCrit;\n","const validateAlgorithms = (option, algorithms) => {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n};\nexport default validateAlgorithms;\n","import { JOSENotSupported } from '../util/errors.js';\nexport default function subtleDsa(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n return { name: 'Ed25519' };\n case 'EdDSA':\n return { name: algorithm.name };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\n","import crypto, { isCryptoKey } from './webcrypto.js';\nimport { checkSigCryptoKey } from '../lib/crypto_key.js';\nimport invalidKeyInput from '../lib/invalid_key_input.js';\nimport { types } from './is_key_like.js';\nimport normalize from './normalize_key.js';\nexport default async function getCryptoKey(alg, key, usage) {\n if (usage === 'sign') {\n key = await normalize.normalizePrivateKey(key, alg);\n }\n if (usage === 'verify') {\n key = await normalize.normalizePublicKey(key, alg);\n }\n if (isCryptoKey(key)) {\n checkSigCryptoKey(key, alg, usage);\n return key;\n }\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, ...types));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array', 'JSON Web Key'));\n}\n","import subtleAlgorithm from './subtle_dsa.js';\nimport crypto from './webcrypto.js';\nimport checkKeyLength from './check_key_length.js';\nimport getVerifyKey from './get_sign_verify_key.js';\nconst verify = async (alg, key, signature, data) => {\n const cryptoKey = await getVerifyKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n};\nexport default verify;\n","import { decode as base64url } from '../../runtime/base64url.js';\nimport verify from '../../runtime/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder } from '../../lib/buffer_utils.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport isObject from '../../lib/is_object.js';\nimport { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport validateAlgorithms from '../../lib/validate_algorithms.js';\nimport { isJWK } from '../../lib/is_jwk.js';\nimport { importJWK } from '../../key/import.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = base64url(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n checkKeyTypeWithJwk(alg, key, 'verify');\n if (isJWK(key)) {\n key = await importJWK(key, alg);\n }\n }\n else {\n checkKeyTypeWithJwk(alg, key, 'verify');\n }\n const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);\n let signature;\n try {\n signature = base64url(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const verified = await verify(alg, key, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = base64url(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","export default (date) => Math.floor(date.getTime() / 1000);\n","const minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport default (str) => {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n};\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { decoder } from './buffer_utils.js';\nimport epoch from './epoch.js';\nimport secs from './secs.js';\nimport isObject from './is_object.js';\nconst normalizeTyp = (value) => value.toLowerCase().replace(/^application\\//, '');\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport default (protectedHeader, encodedPayload, options = {}) => {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n};\n","import { compactVerify } from '../jws/compact/verify.js';\nimport jwtPayload from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = jwtPayload(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nfunction clone(obj) {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\nclass LocalJWKSet {\n constructor(jwks) {\n this._cached = new WeakMap();\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this._jwks = clone(jwks);\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this._jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && typeof jwk.alg === 'string') {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES256K':\n candidate = jwk.crv === 'secp256k1';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n candidate = jwk.crv === 'Ed25519';\n break;\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const { _cached } = this;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this._cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => clone(set._jwks),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSTimeout } from '../util/errors.js';\nconst fetchJwks = async (url, timeout, options) => {\n let controller;\n let id;\n let timedOut = false;\n if (typeof AbortController === 'function') {\n controller = new AbortController();\n id = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n }\n const response = await fetch(url.href, {\n signal: controller ? controller.signal : undefined,\n redirect: 'manual',\n headers: options.headers,\n }).catch((err) => {\n if (timedOut)\n throw new JWKSTimeout();\n throw err;\n });\n if (id !== undefined)\n clearTimeout(id);\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n};\nexport default fetchJwks;\n","import fetchJwks from '../runtime/fetch_jwks.js';\nimport { JWKSNoMatchingKey } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport isObject from '../lib/is_object.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v5.10.0';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this._url = new URL(url.href);\n this._options = { agent: options?.agent, headers: options?.headers };\n this._timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this._cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this._cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n if (options?.[jwksCache] !== undefined) {\n this._cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this._cacheMaxAge)) {\n this._jwksTimestamp = this._cache.uat;\n this._local = createLocalJWKSet(this._cache.jwks);\n }\n }\n }\n coolingDown() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cooldownDuration\n : false;\n }\n fresh() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cacheMaxAge\n : false;\n }\n async getKey(protectedHeader, token) {\n if (!this._local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this._local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this._local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this._pendingFetch && isCloudflareWorkers()) {\n this._pendingFetch = undefined;\n }\n const headers = new Headers(this._options.headers);\n if (USER_AGENT && !headers.has('User-Agent')) {\n headers.set('User-Agent', USER_AGENT);\n this._options.headers = Object.fromEntries(headers.entries());\n }\n this._pendingFetch || (this._pendingFetch = fetchJwks(this._url, this._timeoutDuration, this._options)\n .then((json) => {\n this._local = createLocalJWKSet(json);\n if (this._cache) {\n this._cache.uat = Date.now();\n this._cache.jwks = json;\n }\n this._jwksTimestamp = Date.now();\n this._pendingFetch = undefined;\n })\n .catch((err) => {\n this._pendingFetch = undefined;\n throw err;\n }));\n await this._pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => !!set._pendingFetch,\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set._local?.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\nexport const experimental_jwksCache = jwksCache;\n","import * as base64url from '../runtime/base64url.js';\nexport const encode = base64url.encode;\nexport const decode = base64url.decode;\n","import { decode as base64url } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport isObject from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = base64url(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","/**\n * Token Utilities\n *\n * Functions for decoding, validating, and checking JWT tokens.\n */\n\nimport {\n decodeJwt,\n jwtVerify,\n createRemoteJWKSet,\n type JWTPayload as JoseJWTPayload,\n} from \"jose\";\nimport { AUTH_CONSTANTS } from \"./constants\";\nimport type { JWTPayload, TokenValidationResult } from \"./types\";\nimport { isUserType } from \"./types\";\n\n/**\n * Extract a JWTPayload from a jose-decoded JWT payload.\n *\n * Type assertions are required because jose's payload type uses `unknown`\n * for custom claims. This helper centralises the mapping so that\n * both {@link decodeToken} and {@link verifyToken} share the same logic.\n */\nfunction extractPayloadFromJose(\n decoded: JoseJWTPayload & Partial<JWTPayload>,\n): JWTPayload {\n const rawUserType = decoded.user_type;\n const rawOgUserType = decoded.og_user_type;\n\n return {\n id: typeof decoded.id === \"number\" ? decoded.id : undefined,\n email: typeof decoded.email === \"string\" ? decoded.email : undefined,\n full_name:\n typeof decoded.full_name === \"string\" ? decoded.full_name : undefined,\n user_type:\n typeof rawUserType === \"string\" && isUserType(rawUserType)\n ? rawUserType\n : \"rep\",\n og_user_type:\n typeof rawOgUserType === \"string\" && isUserType(rawOgUserType)\n ? rawOgUserType\n : undefined,\n company_id:\n typeof decoded.company_id === \"number\" ? decoded.company_id : undefined,\n exp: decoded.exp,\n auth_type:\n typeof decoded.auth_type === \"string\" ? decoded.auth_type : undefined,\n };\n}\n\n/**\n * Decode a JWT token and extract its payload.\n *\n * **Security note:** This function does NOT verify the JWT signature.\n * It only decodes the payload. Any valid JWT structure will be accepted,\n * regardless of who signed it.\n *\n * Client-side token decoding is used for UX purposes only (displaying\n * user info, role-based UI). The real security boundary is the server-side\n * API, which verifies the signature on every request.\n *\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @returns The decoded JWT payload, or null if decoding fails\n */\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n // Type assertion required: jose's decodeJwt returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = decodeJwt(token) as JoseJWTPayload & Partial<JWTPayload>;\n\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] Failed to decode JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Check if a token has expired.\n * Includes a configurable grace period to account for clock skew.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period in milliseconds (default: 30 seconds)\n * @returns true if the token is expired, false otherwise\n */\nexport function isTokenExpired(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): boolean {\n try {\n const decoded = decodeJwt(token);\n\n // If no expiration, token never expires\n if (!decoded.exp) {\n return false;\n }\n\n // exp is in seconds, convert to milliseconds\n const expirationTime = decoded.exp * 1000;\n const currentTime = Date.now();\n\n // Token is expired if current time is past expiration + grace period\n return currentTime > expirationTime + gracePeriodMs;\n } catch {\n // If we can't decode the token, treat it as expired\n return true;\n }\n}\n\n/**\n * Validate a JWT token for format and expiration.\n *\n * **Security note:** This function checks JWT structure and expiration\n * but does NOT verify the signature. It is a UX-level check only.\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period for expiration check (default: 30 seconds)\n * @returns Validation result with status and decoded payload if valid\n */\nexport function validateToken(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): TokenValidationResult {\n // Check if token is provided\n if (!token || token.trim() === \"\") {\n return {\n isValid: false,\n error: \"Token is empty or not provided\",\n };\n }\n\n // Try to decode the token\n const payload = decodeToken(token);\n if (!payload) {\n return {\n isValid: false,\n error: \"Token has invalid format\",\n };\n }\n\n // Check expiration\n if (isTokenExpired(token, gracePeriodMs)) {\n return {\n isValid: false,\n payload,\n error: \"Token has expired\",\n };\n }\n\n return {\n isValid: true,\n payload,\n };\n}\n\n/**\n * Type guard to check if a validation result is valid.\n * Enables TypeScript narrowing of the result type.\n *\n * @param result - The validation result to check\n * @returns true if the token is valid (narrows payload to non-optional)\n */\nexport function isValidToken(\n result: TokenValidationResult,\n): result is TokenValidationResult & { isValid: true; payload: JWTPayload } {\n return result.isValid === true;\n}\n\n/**\n * Get the expiration time of a token as a Date.\n *\n * @param token - The JWT token string\n * @returns The expiration Date, or null if token has no expiration or is invalid\n */\nexport function getTokenExpiration(token: string): Date | null {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return null;\n }\n return new Date(decoded.exp * 1000);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the time remaining until token expiration in milliseconds.\n *\n * @param token - The JWT token string\n * @returns Milliseconds until expiration, or 0 if expired/invalid, or Infinity if no expiration\n */\nexport function getTokenTimeRemaining(token: string): number {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return Infinity;\n }\n const expirationTime = decoded.exp * 1000;\n const remaining = expirationTime - Date.now();\n return Math.max(0, remaining);\n } catch {\n return 0;\n }\n}\n\n/**\n * Verify a JWT token's signature using a JWKS endpoint and extract its payload.\n *\n * Unlike {@link decodeToken}, this function cryptographically verifies\n * that the token was signed by a trusted key.\n *\n * @param token - The JWT token string\n * @param jwksUrl - URL of the JWKS endpoint\n * @returns The verified JWT payload, or null if verification fails\n */\nexport async function verifyToken(\n token: string,\n jwksUrl: string,\n): Promise<JWTPayload | null> {\n try {\n const JWKS = createRemoteJWKSet(new URL(jwksUrl));\n const { payload } = await jwtVerify(token, JWKS);\n\n // Type assertion required: jose's jwtVerify returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = payload as JoseJWTPayload & Partial<JWTPayload>;\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] JWT signature verification failed:\", error);\n return null;\n }\n}\n","/**\n * Token Storage Utilities\n *\n * Functions for storing and retrieving auth tokens from\n * cookies and localStorage.\n */\n\nimport { AUTH_CONSTANTS, STORAGE_KEYS } from \"./constants\";\nimport type { FluidAuthConfig } from \"./types\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Parse cookies from document.cookie string into an object.\n */\nfunction parseCookies(): Record<string, string> {\n if (!isBrowser()) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const cookieString = document.cookie;\n\n if (!cookieString) {\n return cookies;\n }\n\n cookieString.split(\";\").forEach((cookie) => {\n const [name, ...valueParts] = cookie.trim().split(\"=\");\n if (name) {\n cookies[name] = decodeURIComponent(valueParts.join(\"=\"));\n }\n });\n\n return cookies;\n}\n\n/**\n * Set a cookie with the given options.\n */\nfunction setCookie(\n name: string,\n value: string,\n options: Readonly<{\n maxAge?: number;\n path?: string;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n secure?: boolean;\n }> = {},\n): void {\n if (!isBrowser()) {\n return;\n }\n\n const {\n maxAge = AUTH_CONSTANTS.COOKIE_MAX_AGE,\n path = \"/\",\n sameSite = \"lax\",\n secure = window.location.protocol === \"https:\",\n } = options;\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n cookieString += `; path=${path}`;\n cookieString += `; max-age=${maxAge}`;\n cookieString += `; samesite=${sameSite}`;\n\n if (secure) {\n cookieString += \"; secure\";\n }\n\n document.cookie = cookieString;\n}\n\n/**\n * Delete a cookie by setting its max-age to 0.\n */\nfunction deleteCookie(name: string, path: string = \"/\"): void {\n if (!isBrowser()) {\n return;\n }\n\n document.cookie = `${name}=; path=${path}; max-age=0`;\n}\n\n/**\n * Get the stored auth token.\n * Checks cookie first, then falls back to localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n * @returns The stored token or null if not found\n */\nexport function getStoredToken(config?: FluidAuthConfig): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const localStorageKey = STORAGE_KEYS.USER_TOKEN;\n\n // Priority: cookie > localStorage\n const cookies = parseCookies();\n const cookieToken = cookies[cookieKey];\n\n if (cookieToken) {\n return cookieToken;\n }\n\n try {\n return localStorage.getItem(localStorageKey);\n } catch {\n // localStorage might be unavailable (private browsing, etc.)\n return null;\n }\n}\n\n/**\n * Store an auth token in both cookie and localStorage.\n * Using both provides redundancy and compatibility with different auth flows.\n *\n * @param token - The JWT token to store\n * @param config - Optional auth config for custom storage options\n */\nexport function storeToken(token: string, config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const maxAge = config?.cookieMaxAge ?? AUTH_CONSTANTS.COOKIE_MAX_AGE;\n\n // Store in cookie\n try {\n const inIframe = window.self !== window.top;\n const sameSite = inIframe ? \"none\" : \"lax\";\n setCookie(cookieKey, token, {\n maxAge,\n path: \"/\",\n sameSite,\n // SameSite=None requires Secure per RFC 6265bis; browsers silently\n // reject the cookie otherwise (e.g. HTTP localhost in an iframe).\n secure: sameSite === \"none\" || window.location.protocol === \"https:\",\n });\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in cookie:\", error);\n }\n\n // Also store in localStorage as backup\n try {\n localStorage.setItem(STORAGE_KEYS.USER_TOKEN, token);\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in localStorage:\", error);\n }\n}\n\n/**\n * Clear all stored auth tokens from cookies and localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n */\nexport function clearTokens(config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n\n // Clear cookie\n try {\n deleteCookie(cookieKey);\n } catch {\n // Ignore cleanup errors\n }\n\n // Clear localStorage\n try {\n localStorage.removeItem(STORAGE_KEYS.USER_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.COMPANY_TOKEN);\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if any auth token is stored.\n *\n * @param config - Optional auth config\n * @returns true if a token is stored, false otherwise\n */\nexport function hasStoredToken(config?: FluidAuthConfig): boolean {\n return getStoredToken(config) !== null;\n}\n\n/**\n * Clear all stored auth tokens and redirect the user.\n * Combines clearTokens() + window redirect in a single call.\n *\n * @param redirectUrl - URL to redirect to after clearing tokens (default: \"/\")\n * @param config - Optional auth config for custom cookie key\n */\nexport function handleAuthError(\n redirectUrl: string = \"/\",\n config?: FluidAuthConfig,\n): void {\n clearTokens(config);\n if (isBrowser()) {\n window.location.href = redirectUrl;\n }\n}\n","/**\n * URL Token Utilities\n *\n * Functions for extracting and cleaning auth tokens from URL parameters.\n * This is the primary way tokens are passed from the parent Fluid Commerce\n * app to embedded portals.\n *\n * **Security model**: Tokens in URL parameters are a known tradeoff.\n * The token is extracted and immediately cleaned from the URL via\n * `history.replaceState()`. A `Referrer-Policy` meta tag in the\n * starter template prevents the token from leaking in referrer headers.\n */\n\nimport { URL_PARAMS } from \"./constants\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Extract the auth token from the URL query parameters.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns The token value or null if not present\n */\nexport function extractTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the company token from the URL query parameters.\n * This is a legacy parameter that may still be used in some flows.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidCompanyToken\")\n * @returns The token value or null if not present\n */\nexport function extractCompanyTokenFromUrl(\n tokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Remove the auth token from the URL without reloading the page.\n * This prevents the token from being accidentally shared via URL copy/paste\n * or appearing in browser history.\n *\n * Uses history.replaceState to update the URL cleanly.\n *\n * @param tokenKey - The URL parameter name to remove (default: \"fluidUserToken\")\n */\nexport function cleanTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const url = new URL(window.location.href);\n const hadToken = url.searchParams.has(tokenKey);\n const hadCompanyToken = url.searchParams.has(URL_PARAMS.COMPANY_TOKEN);\n\n // Remove both user and company tokens\n url.searchParams.delete(tokenKey);\n url.searchParams.delete(URL_PARAMS.COMPANY_TOKEN);\n\n // Only update URL if we actually removed something\n if (hadToken || hadCompanyToken) {\n // Use replaceState to avoid adding to browser history\n window.history.replaceState(\n window.history.state,\n document.title,\n url.toString(),\n );\n }\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to clean token from URL:\", error);\n }\n}\n\n/**\n * Check if the URL contains an auth token parameter.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns true if the URL contains the token parameter\n */\nexport function hasTokenInUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.has(tokenKey);\n } catch {\n return false;\n }\n}\n\n/**\n * Extract all auth-related tokens from the URL at once.\n *\n * @param userTokenKey - The URL parameter name for user token\n * @param companyTokenKey - The URL parameter name for company token\n * @returns Object with both token values (or null if not present)\n */\nexport function extractAllTokensFromUrl(\n userTokenKey: string = URL_PARAMS.USER_TOKEN,\n companyTokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): { userToken: string | null; companyToken: string | null } {\n if (!isBrowser()) {\n return { userToken: null, companyToken: null };\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return {\n userToken: searchParams.get(userTokenKey),\n companyToken: searchParams.get(companyTokenKey),\n };\n } catch {\n return { userToken: null, companyToken: null };\n }\n}\n","import type { JWTPayload } from \"./types\";\nimport { USER_TYPES } from \"./types\";\n\n/**\n * Check if dev bypass should be active.\n * Requires both the config flag AND Vite dev mode.\n */\nexport function isDevBypassActive(devBypass?: boolean): boolean {\n if (!devBypass) return false;\n\n try {\n // import.meta.env.DEV is a Vite compile-time constant.\n // It's `true` in dev mode and completely tree-shaken in production.\n // The type assertion avoids requiring Vite ambient types in all consumers.\n const meta = import.meta as { env?: { DEV?: boolean } };\n return meta.env?.DEV === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a synthetic dev user for local development.\n * This user has realistic data for UI rendering but no real auth.\n */\nexport function createDevUser(): JWTPayload {\n return {\n id: 99999, // Dev placeholder — avoids falsy 0\n email: \"dev@localhost\",\n full_name: \"Dev User\",\n user_type: USER_TYPES.rep,\n og_user_type: undefined,\n company_id: 99999, // Dev placeholder — avoids falsy 0\n exp: undefined, // Never expires\n auth_type: \"dev_bypass\",\n };\n}\n","import { z } from \"zod\";\nimport type { FetchClientInstance } from \"@fluid-app/api-client-core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface Company {\n id: number;\n name: string;\n logo_url?: string | null;\n icon_url?: string | null;\n}\n\nexport interface SwitchCompanyResponseCompany {\n id: number;\n name: string;\n fluid_shop: string;\n logo_url?: string | null;\n jwt: string;\n}\n\nexport interface SwitchCompanyResponseMeta {\n request_id: string;\n timestamp: string;\n}\n\nexport interface SwitchCompanyResponse {\n company: SwitchCompanyResponseCompany;\n meta: SwitchCompanyResponseMeta;\n}\n\n// ============================================================================\n// Schemas\n// ============================================================================\n\nexport const companySchema: z.ZodType<Company> = z.object({\n id: z.number(),\n name: z.string(),\n logo_url: z.string().optional().nullable(),\n icon_url: z.string().nullable().optional(),\n});\n\nexport const switchCompanyResponseCompanySchema: z.ZodType<SwitchCompanyResponseCompany> =\n z.object({\n id: z.number().int().positive(),\n name: z.string(),\n fluid_shop: z.string(),\n logo_url: z.string().url().nullable().optional(),\n jwt: z.string(),\n });\n\nexport const switchCompanyResponseMetaSchema: z.ZodType<SwitchCompanyResponseMeta> =\n z.object({\n request_id: z.string(),\n timestamp: z.string(),\n });\n\nexport const switchCompanyResponseSchema: z.ZodType<SwitchCompanyResponse> =\n z.object({\n company: switchCompanyResponseCompanySchema,\n meta: switchCompanyResponseMetaSchema,\n });\n\n// ============================================================================\n// API function\n// ============================================================================\n\nexport function switchCompany(\n client: FetchClientInstance,\n companyId: number,\n): Promise<SwitchCompanyResponse> {\n return client\n .put<unknown>(`/authentication/company/${companyId}/switch`)\n .then((data) => switchCompanyResponseSchema.parse(data));\n}\n","/**\n * Auth Redirect Utilities\n *\n * Provides default redirect behavior for authentication failures.\n * When no custom callback is provided, the SDK redirects to Fluid's\n * auth page with a redirect_url pointing back to the current page.\n *\n * Includes loop detection: if a redirect was attempted within the\n * cooldown window, subsequent calls are suppressed to prevent\n * infinite redirect cycles (e.g., auth returns a token the API rejects).\n */\n\n/**\n * Default Fluid authentication URL.\n * Users are redirected here when auth fails and no custom handler is provided.\n */\nexport const DEFAULT_AUTH_URL = \"https://auth.fluid.app\";\n\n/**\n * URL parameter name used by auth.fluid.app when redirecting back with a token.\n * This differs from the SDK's default `fluidUserToken` (used by the parent Fluid app\n * when embedding portals in iframes). The auth provider checks both.\n */\nexport const AUTH_REDIRECT_TOKEN_KEY = \"jwt\";\n\n/** sessionStorage key for loop detection */\nconst REDIRECT_TIMESTAMP_KEY = \"__fluid_auth_redirect_ts\";\n\n/** Minimum seconds between redirect attempts */\nconst REDIRECT_COOLDOWN_S = 10;\n\n/**\n * Check if a redirect was recently attempted.\n * Returns true if we should suppress the redirect to avoid a loop.\n */\nfunction isRedirectLoop(): boolean {\n try {\n const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);\n if (!ts) return false;\n const elapsed = (Date.now() - Number(ts)) / 1000;\n return elapsed < REDIRECT_COOLDOWN_S;\n } catch {\n // sessionStorage unavailable (SSR, privacy mode) — allow redirect\n return false;\n }\n}\n\n/**\n * Record that a redirect is about to happen.\n */\nfunction markRedirect(): void {\n try {\n sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));\n } catch {\n // sessionStorage unavailable — best-effort\n }\n}\n\n/**\n * Creates a redirect function that navigates to the auth URL\n * with the current page URL encoded as a redirect parameter.\n *\n * Includes loop detection: if a redirect was attempted within the last\n * {@link REDIRECT_COOLDOWN_S} seconds, the redirect is suppressed and\n * the normal error UI is allowed to render instead.\n *\n * @param authUrl - Custom auth URL to redirect to. Defaults to DEFAULT_AUTH_URL.\n * @returns A function that performs the redirect when called (no-op if loop detected).\n */\nexport function createDefaultAuthRedirect(authUrl?: string): () => void {\n return () => {\n if (isRedirectLoop()) {\n console.warn(\n \"[FluidAuth] Auth redirect suppressed — possible redirect loop. \" +\n \"Check that your auth server returns a token accepted by the API.\",\n );\n return;\n }\n markRedirect();\n const base = authUrl ?? DEFAULT_AUTH_URL;\n const currentUrl = encodeURIComponent(window.location.href);\n window.location.href = `${base}/?redirect_url=${currentUrl}`;\n };\n}\n\n/**\n * Resolves the effective auth failure handler.\n * Returns the custom callback if provided, otherwise creates a default redirect.\n *\n * @param onAuthFailure - Custom callback from user config\n * @param authUrl - Custom auth URL (only used when creating the default redirect)\n * @returns The resolved handler function\n */\nexport function resolveAuthFailureHandler(\n onAuthFailure?: (() => void) | undefined,\n authUrl?: string | undefined,\n): () => void {\n return onAuthFailure ?? createDefaultAuthRedirect(authUrl);\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/portal-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/portal-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/portal-core/types\";\nimport type { components } from \"@fluid-app/fluidos-api-client\";\n\n/** Raw navigation item from the FluidOS API (derived from generated types) */\nexport type RawApiNavigationItem =\n components[\"schemas\"][\"FluidOSNavigationItem\"];\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/portal-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/** Raw manifest shape from the `/fluid_os/definitions/active` API response */\nexport interface RawManifestResponse {\n manifest: {\n definition_id: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id: number;\n themes?: RawApiTheme[];\n navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * This is the top-level transform used by `FluidClient.app.get()`.\n * It handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n\n return {\n definition_id: manifest.definition_id,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? manifest.definition_id,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? manifest.definition_id,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? manifest.definition_id,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","/**\n * Fluid API Client\n * Adapted from: packages/fluidos-api-client/src/lib/fetch-client.ts\n * Provides authenticated API access with domain-specific methods\n */\n\nimport type { SwitchCompanyResponse } from \"@fluid-app/auth\";\nimport type { Rep, UpdateRepData, UserMe } from \"../types/rep\";\nimport type { Profile } from \"../types/profile\";\nimport type { UserPermissions } from \"../types/permissions\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\nimport {\n createFetchClient,\n fluidOs,\n type FetchClient,\n} from \"@fluid-app/fluidos-api-client\";\nimport {\n HTTP_METHODS,\n type FluidSDKConfig,\n type RequestOptions,\n type BaseListParams,\n} from \"./types\";\nimport { createDefaultAuthRedirect } from \"../auth/auth-redirect\";\nimport {\n transformManifestToRepAppData,\n type RawManifestResponse,\n} from \"../transforms\";\n\n/**\n * API Error class for structured error handling\n */\nexport class ApiError extends Error {\n readonly status: number;\n readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n // V8-specific stack trace capture (Node.js, Chrome)\n const errorWithCapture = Error as typeof Error & {\n captureStackTrace?: (\n target: object,\n constructor: typeof ApiError,\n ) => void;\n };\n if (errorWithCapture.captureStackTrace) {\n errorWithCapture.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n// ============================================================================\n// Discriminated Union for API Responses\n// ============================================================================\n\n/**\n * Discriminated union representing the result of an API call.\n * Use `isApiSuccess` and `isApiFailure` type guards to narrow.\n */\nexport type ApiResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: ApiError };\n\n/**\n * Type guard for successful API result\n */\nexport function isApiSuccess<T>(\n result: ApiResult<T>,\n): result is { readonly success: true; readonly data: T } {\n return result.success === true;\n}\n\n/**\n * Type guard for failed API result\n */\nexport function isApiFailure<T>(\n result: ApiResult<T>,\n): result is { readonly success: false; readonly error: ApiError } {\n return result.success === false;\n}\n\n/**\n * Type guard to check if a value is a non-null string\n */\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Extract error message from API response data using `in` operator narrowing.\n * Checks common error message field names in order of precedence.\n */\nfunction extractErrorMessage(\n data: Readonly<Record<string, unknown>>,\n fallback: string,\n): string {\n // Use `in` operator to narrow and then type guard to validate string type\n if (\"message\" in data && isString(data.message)) {\n return data.message;\n }\n if (\"error_message\" in data && isString(data.error_message)) {\n return data.error_message;\n }\n if (\"error\" in data && isString(data.error)) {\n return data.error;\n }\n return fallback;\n}\n\n// ============================================================================\n// Domain Types\n// ============================================================================\n\n// ============================================================================\n// Product Types\n// ============================================================================\n\nexport interface Product {\n readonly id: number;\n readonly title: string;\n readonly sku?: string | null;\n readonly price: string | number;\n readonly description?: string | null;\n readonly image_url?: string;\n readonly status?: string;\n readonly active?: boolean;\n readonly slug?: string;\n readonly in_stock?: boolean;\n readonly display_price?: string;\n readonly currency_code?: string;\n readonly updated_at?: string;\n}\n\nexport interface ProductListParams extends BaseListParams {\n readonly search_query?: string;\n readonly status?: readonly (\"active\" | \"draft\" | \"archived\" | \"all\")[];\n readonly category_id?: string;\n readonly category_ids?: readonly number[];\n readonly collection_id?: string;\n readonly collection_ids?: readonly number[];\n readonly order_by?: readonly string[];\n readonly country_code?: readonly string[];\n readonly published_stores?: readonly (\"retail\" | \"rep\")[];\n}\n\nexport interface ProductsResponse {\n readonly products: readonly Product[];\n readonly meta: {\n readonly request_id: string;\n readonly timestamp: string;\n readonly pagination?: {\n readonly current_page: number;\n readonly per_page: number;\n readonly total_pages: number;\n readonly total_count: number;\n };\n };\n}\n\n// ============================================================================\n// Order Types\n// ============================================================================\n\nexport interface Order {\n readonly id: string;\n readonly order_number: string;\n readonly status: string;\n readonly total: number;\n readonly customer_id: string;\n readonly rep_id?: string;\n readonly created_at: string;\n readonly updated_at: string;\n}\n\nexport interface OrderListParams extends BaseListParams {\n readonly status?: string;\n readonly customer_id?: string;\n readonly date_from?: string;\n readonly date_to?: string;\n}\n\nexport interface CreateOrderData {\n readonly customer_id: string;\n readonly line_items: readonly OrderLineItem[];\n readonly notes?: string;\n}\n\nexport interface OrderLineItem {\n readonly product_id: string;\n readonly quantity: number;\n readonly price?: number;\n}\n\n// ============================================================================\n// Analytics Types\n// ============================================================================\n\nexport interface DashboardData {\n readonly total_sales: number;\n readonly total_orders: number;\n readonly total_customers: number;\n readonly recent_orders: readonly Order[];\n}\n\nexport interface SalesParams {\n readonly date_from?: string;\n readonly date_to?: string;\n readonly group_by?: \"day\" | \"week\" | \"month\";\n}\n\nexport interface SalesData {\n readonly total: number;\n readonly data: readonly SalesDataPoint[];\n}\n\nexport interface SalesDataPoint {\n readonly date: string;\n readonly amount: number;\n readonly orders: number;\n}\n\n// ============================================================================\n// Client Return Type\n// ============================================================================\n\n/**\n * The shape returned by `createFluidClient`.\n * Generic helper methods preserve their type parameters so callers\n * can specify response types at each call site.\n */\nexport interface FluidClientReturn {\n readonly fetchClient: FetchClient;\n\n readonly request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n\n readonly requestNullable: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse | null>;\n\n readonly safeRequest: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<ApiResult<TResponse>>;\n\n readonly get: <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n\n readonly post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n\n readonly products: {\n readonly list: (params?: ProductListParams) => Promise<ProductsResponse>;\n readonly get: (id: string | number) => Promise<{ product: Product }>;\n readonly search: (\n query: string,\n params?: ProductListParams,\n ) => Promise<ProductsResponse>;\n };\n\n readonly orders: {\n readonly list: (params?: OrderListParams) => Promise<Order[]>;\n readonly get: (id: string) => Promise<Order>;\n readonly create: (data: CreateOrderData) => Promise<Order>;\n };\n\n readonly users: {\n readonly me: () => Promise<UserMe>;\n readonly switchCompany: (\n companyId: number,\n ) => Promise<SwitchCompanyResponse>;\n };\n\n readonly reps: {\n readonly current: () => Promise<Rep>;\n readonly updateProfile: (data: UpdateRepData) => Promise<Rep>;\n };\n\n readonly profile: {\n readonly get: () => Promise<Profile>;\n };\n\n readonly app: {\n readonly getRaw: () => Promise<RawManifestResponse>;\n readonly get: () => Promise<RepAppData>;\n };\n\n readonly permissions: {\n readonly get: () => Promise<UserPermissions>;\n };\n\n readonly analytics: {\n readonly dashboard: () => Promise<DashboardData>;\n readonly sales: (params?: SalesParams) => Promise<SalesData>;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\n/**\n * Creates a configured Fluid API client instance\n */\nexport function createFluidClient(config: FluidSDKConfig): FluidClientReturn {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();\n\n // Create a fluidos FetchClient for structured API calls (manifest, etc.)\n // Conditional spread for exactOptionalPropertyTypes: only include getAuthToken when defined\n const fetchClient: FetchClient = createFetchClient({\n baseUrl,\n ...(getAuthToken ? { getAuthToken } : {}),\n onAuthError: effectiveOnAuthError,\n defaultHeaders,\n });\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters (Rails-compatible)\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Construct URL by concatenating baseUrl + endpoint\n // Using URL constructor with relative paths would strip the baseUrl path (e.g., /api)\n const normalizedBase = baseUrl.endsWith(\"/\")\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedEndpoint = endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`;\n const url = new URL(normalizedBase + normalizedEndpoint);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n for (const item of value) {\n url.searchParams.append(`${key}[]`, String(item));\n }\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (subValue === undefined || subValue === null) {\n continue;\n }\n\n if (Array.isArray(subValue)) {\n for (const item of subValue) {\n url.searchParams.append(`${key}[${subKey}][]`, String(item));\n }\n } else {\n url.searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Default request options for type-safe defaults.\n * Uses `satisfies` to validate against RequestOptions while preserving literal types.\n */\n const defaultRequestOptions = {\n method: HTTP_METHODS.GET,\n } as const satisfies Partial<RequestOptions>;\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = defaultRequestOptions.method,\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n // Use buildUrl for all requests to ensure baseUrl path is preserved\n const url = buildUrl(\n endpoint,\n method === HTTP_METHODS.GET ? params : undefined,\n );\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n // Only add signal and body when defined to satisfy exactOptionalPropertyTypes\n // RequestInit expects signal: AbortSignal | null, not undefined\n if (signal !== undefined) {\n fetchOptions.signal = signal;\n }\n if (body && method !== HTTP_METHODS.GET) {\n fetchOptions.body = JSON.stringify(body);\n }\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Handle authentication errors — invoke the handler, then throw so\n // TanStack Query surfaces the error instead of caching `null` as data.\n if (response.status === 401) {\n effectiveOnAuthError();\n throw new ApiError(\"Authentication required\", 401, null);\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = (await response.json()) as Record<string, unknown>;\n // Use `in` operator narrowing to safely extract error message\n const errorMessage = extractErrorMessage(\n data,\n `${method} request failed`,\n );\n throw new ApiError(\n errorMessage,\n response.status,\n \"errors\" in data ? data.errors : data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (isApiError(error)) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting nullable responses should use requestNullable<T>\n // which properly types the return as T | null\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n // Type assertion required: 204 No Content has no body to parse.\n // This is safe when TResponse is a union including null (e.g., T | null).\n // For fully type-safe nullable handling, prefer requestNullable() or safeRequest().\n return null as TResponse;\n }\n\n try {\n const data: unknown = await response.json();\n // Runtime check: verify we got an object/array, not a primitive that would be mistyped\n if (data === null || data === undefined) {\n throw new ApiError(\n \"Unexpected null/undefined in JSON response\",\n response.status,\n null,\n );\n }\n // Type assertion required: JSON.parse returns `unknown`, but we've validated\n // the response is not null/undefined. The caller specifies TResponse based on\n // their knowledge of the API endpoint's response schema.\n return data as TResponse;\n } catch (parseError) {\n if (isApiError(parseError)) {\n throw parseError;\n }\n throw new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n );\n }\n }\n\n /**\n * Request function for endpoints that may return null (204 No Content).\n * Properly types the return as T | null.\n */\n async function requestNullable<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse | null> {\n return request<TResponse | null>(endpoint, options);\n }\n\n /**\n * Safe request wrapper that returns a discriminated union instead of throwing.\n * Use `isApiSuccess` or `isApiFailure` to narrow the result.\n */\n async function safeRequest<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<ApiResult<TResponse>> {\n try {\n const data = await request<TResponse>(endpoint, options);\n return { success: true, data };\n } catch (error) {\n if (isApiError(error)) {\n return { success: false, error };\n }\n // Wrap unknown errors in ApiError\n return {\n success: false,\n error: new ApiError(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n null,\n ),\n };\n }\n }\n\n /**\n * Helper to safely convert typed params to Record<string, unknown>.\n * Type assertion required: TypeScript's structural typing allows any object\n * to be treated as Record<string, unknown> when we only need to iterate\n * over its entries. This is safe because buildUrl only reads properties.\n */\n function toParams<T extends object>(\n params: T | undefined,\n ): Record<string, unknown> | undefined {\n return params as Record<string, unknown> | undefined;\n }\n\n // Convenience HTTP methods using HTTP_METHODS constant for type safety\n const get = <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> => {\n // Build request options object, only adding params if defined\n const baseOptions = {\n ...options,\n method: HTTP_METHODS.GET,\n } satisfies RequestOptions;\n\n const convertedParams = toParams(params);\n const requestOptions: RequestOptions =\n convertedParams !== undefined\n ? { ...baseOptions, params: convertedParams }\n : baseOptions;\n\n return request<TResponse>(endpoint, requestOptions);\n };\n\n const post = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.POST,\n body,\n } satisfies RequestOptions);\n\n const put = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PUT,\n body,\n } satisfies RequestOptions);\n\n const patch = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PATCH,\n body,\n } satisfies RequestOptions);\n\n const del = <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.DELETE,\n } satisfies RequestOptions);\n\n // ============================================================================\n // Domain-Specific API Methods\n // ============================================================================\n\n return {\n // Fluidos FetchClient for structured API calls\n fetchClient: fetchClient,\n\n // Low-level methods for custom endpoints\n request: request,\n requestNullable: requestNullable,\n safeRequest: safeRequest,\n get: get,\n post: post,\n put: put,\n patch: patch,\n delete: del,\n\n // Products API - matches fluid-admin's /company/v1/products\n products: {\n list: (params?: ProductListParams): Promise<ProductsResponse> =>\n get<ProductsResponse, ProductListParams>(\n \"/api/company/v1/products\",\n params,\n ),\n get: (id: string | number): Promise<{ product: Product }> =>\n get<{ product: Product }>(`/api/company/v1/products/${id}`),\n search: (\n query: string,\n params?: ProductListParams,\n ): Promise<ProductsResponse> =>\n get<ProductsResponse>(\"/api/company/v1/products\", {\n search_query: query,\n ...params,\n } as Record<string, unknown>),\n },\n\n // Orders API\n orders: {\n list: (params?: OrderListParams): Promise<Order[]> =>\n get<Order[], OrderListParams>(\"/api/orders\", params),\n get: (id: string): Promise<Order> => get<Order>(`/api/orders/${id}`),\n create: (data: CreateOrderData): Promise<Order> =>\n post<Order>(\"/api/orders\", data),\n },\n\n // Users API\n users: {\n me: (): Promise<UserMe> => get<UserMe>(\"/api/me\"),\n switchCompany: (companyId: number): Promise<SwitchCompanyResponse> =>\n put<SwitchCompanyResponse>(\n `/api/authentication/company/${companyId}/switch`,\n ),\n },\n\n // Reps API\n reps: {\n current: (): Promise<Rep> => get<Rep>(\"/api/reps/me\"),\n updateProfile: (data: UpdateRepData): Promise<Rep> =>\n patch<Rep>(\"/api/reps/me\", data),\n },\n\n /**\n * Profile API (themes, navigation, screens).\n * @deprecated Use `app.get()` instead — returns full `RepAppData` including `profile`.\n */\n profile: {\n /** @deprecated Use `app.get()` instead. */\n get: async (): Promise<Profile> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n const appData = transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n return appData.profile;\n },\n },\n\n // App API — fluidos endpoint (full manifest with transforms)\n app: {\n /** Fetch the raw manifest (plain JSON, no Color objects). Cache-safe. */\n getRaw: async (): Promise<RawManifestResponse> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n // The fluidos-api-client returns { manifest?, meta? } — cast to\n // RawManifestResponse shape which transformManifestToRepAppData expects\n return raw as unknown as RawManifestResponse;\n },\n /** Fetch the active app definition with full theme/screen/navigation transforms */\n get: async (): Promise<RepAppData> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n return transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n },\n },\n\n // Permissions API\n permissions: {\n get: (): Promise<UserPermissions> =>\n get<UserPermissions>(\"/api/company/roles/my_permissions\"),\n },\n\n // Analytics API\n analytics: {\n dashboard: (): Promise<DashboardData> =>\n get<DashboardData>(\"/api/analytics/dashboard\"),\n sales: (params?: SalesParams): Promise<SalesData> =>\n get<SalesData, SalesParams>(\"/api/analytics/sales\", params),\n },\n };\n}\n\nexport type FluidClient = ReturnType<typeof createFluidClient>;\n","export * from \"@fluid-app/portal-core/theme\";\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using portal-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeTheme,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared portal-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from portal-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps): React.JSX.Element {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n if (currentTheme) {\n removeTheme(currentTheme.id);\n }\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","/**\n * FluidAuthProvider - Authentication Provider for Fluid Portal SDK\n *\n * Handles JWT token extraction from URL, validation, storage, and\n * provides authentication context to child components.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useReducer,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport type {\n FluidAuthConfig,\n FluidAuthContextValue,\n JWTPayload,\n} from \"../auth/types\";\nimport { extractTokenFromUrl, cleanTokenFromUrl } from \"../auth/url-token\";\nimport { getStoredToken, storeToken, clearTokens } from \"../auth/token-storage\";\nimport {\n validateToken,\n verifyToken,\n isTokenExpired,\n} from \"../auth/token-utils\";\nimport { isDevBypassActive, createDevUser } from \"../auth/dev-utils\";\nimport {\n resolveAuthFailureHandler,\n AUTH_REDIRECT_TOKEN_KEY,\n} from \"../auth/auth-redirect\";\n\n/**\n * Auth context - null when outside provider\n */\nconst FluidAuthContext = createContext<FluidAuthContextValue | null>(null);\n\ninterface AuthState {\n isLoading: boolean;\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n}\n\ntype AuthAction =\n | {\n type: \"SET_AUTH\";\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n }\n | { type: \"CLEAR_AUTH\" }\n | { type: \"DONE_LOADING\" };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n switch (action.type) {\n case \"SET_AUTH\":\n return {\n isLoading: false,\n token: action.token,\n user: action.user,\n error: action.error,\n };\n case \"CLEAR_AUTH\":\n return { ...state, token: null, user: null, error: null };\n case \"DONE_LOADING\":\n return { ...state, isLoading: false };\n }\n}\n\nconst initialAuthState: AuthState = {\n isLoading: true,\n token: null,\n user: null,\n error: null,\n};\n\nexport interface FluidAuthProviderProps {\n /** React children to wrap with auth context */\n children: ReactNode;\n /** Auth configuration options */\n config?: FluidAuthConfig;\n}\n\n/**\n * Authentication provider for Fluid portal applications.\n *\n * On mount, this provider:\n * 1. Checks for a token in the URL (passed from parent app)\n * 2. Cleans token from URL immediately (security)\n * 3. Falls back to stored token (cookie/localStorage)\n * 4. Validates the token (checks expiration)\n * 5. Stores valid tokens for future use\n * 6. Calls onAuthFailure if no valid token found\n *\n * @example\n * ```tsx\n * import { FluidAuthProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidAuthProvider\n * config={{\n * onAuthFailure: () => {\n * window.location.href = \"/login\";\n * },\n * }}\n * >\n * <YourApp />\n * </FluidAuthProvider>\n * );\n * }\n * ```\n */\nexport function FluidAuthProvider({\n children,\n config,\n}: FluidAuthProviderProps): React.JSX.Element {\n const configRef = useRef(config);\n configRef.current = config;\n\n const [state, dispatch] = useReducer(authReducer, initialAuthState);\n const { isLoading, token, user, error } = state;\n\n // Initialize auth on mount\n useEffect(() => {\n const initializeAuth = async () => {\n const handleAuthFailure = () => {\n const current = configRef.current;\n const handler = resolveAuthFailureHandler(\n current?.onAuthFailure,\n current?.authUrl,\n );\n handler();\n };\n\n try {\n // DEV BYPASS: Check for env variable token first, then dev bypass\n if (isDevBypassActive(config?.devBypass)) {\n // Check for VITE_DEV_TOKEN env variable first (real token in dev)\n const envToken = import.meta.env.VITE_DEV_TOKEN;\n if (envToken) {\n const validation = validateToken(envToken, config?.gracePeriodMs);\n if (validation.isValid && validation.payload) {\n storeToken(envToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: envToken,\n user: validation.payload,\n error: null,\n });\n return;\n }\n console.warn(\n \"[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user\",\n );\n }\n\n // No valid env token - use synthetic dev user\n console.warn(\n \"[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token.\",\n );\n const devUser = createDevUser();\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: devUser,\n error: null,\n });\n return;\n }\n\n // 1. Try to get token from URL first (fresh authentication)\n const tokenKey = config?.tokenKey ?? \"fluidUserToken\";\n let candidateToken = extractTokenFromUrl(tokenKey);\n\n // Fallback: auth.fluid.app returns the token as \"jwt\", not \"fluidUserToken\"\n if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {\n candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n }\n\n // Clean token from URL immediately after extraction (security)\n // Do this BEFORE validation so the URL is clean even if validation fails\n cleanTokenFromUrl(tokenKey);\n cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n\n // 2. Fall back to stored token\n if (!candidateToken) {\n candidateToken = getStoredToken(config);\n }\n\n // 3. If we have a token, validate it\n if (candidateToken) {\n let payload: JWTPayload | null = null;\n\n if (config?.jwksUrl) {\n // Signature verification enabled - use verifyToken\n payload = await verifyToken(candidateToken, config.jwksUrl);\n if (!payload) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"JWT signature verification failed\"),\n });\n handleAuthFailure();\n return;\n }\n // Also check expiration\n if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"Token has expired\"),\n });\n handleAuthFailure();\n return;\n }\n } else {\n // No JWKS - existing behavior (decode only, check expiration)\n const validation = validateToken(\n candidateToken,\n config?.gracePeriodMs,\n );\n if (validation.isValid && validation.payload) {\n payload = validation.payload;\n } else {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(validation.error ?? \"Invalid token\"),\n });\n handleAuthFailure();\n return;\n }\n }\n\n // Valid token - store it and update state\n storeToken(candidateToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: candidateToken,\n user: payload,\n error: null,\n });\n } else {\n // No token available\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"No authentication token found\"),\n });\n handleAuthFailure();\n }\n } catch (err) {\n const authError =\n err instanceof Error ? err : new Error(\"Authentication error\");\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: authError,\n });\n handleAuthFailure();\n } finally {\n dispatch({ type: \"DONE_LOADING\" });\n }\n };\n\n void initializeAuth();\n // Only run on mount - config changes don't re-initialize\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear auth handler\n const clearAuth = useCallback(() => {\n clearTokens(configRef.current);\n dispatch({ type: \"CLEAR_AUTH\" });\n }, []);\n\n // Memoize context value\n // Use `satisfies` to validate shape at compile time while preserving inference\n const contextValue = useMemo(\n () =>\n ({\n isAuthenticated: user !== null,\n isLoading,\n user,\n token,\n clearAuth,\n error,\n }) satisfies FluidAuthContextValue,\n [token, isLoading, user, clearAuth, error],\n );\n\n return (\n <FluidAuthContext.Provider value={contextValue}>\n {children}\n </FluidAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access the auth context directly.\n * Prefer using `useFluidAuth` for most use cases.\n *\n * @throws Error if used outside FluidAuthProvider\n */\nexport function useFluidAuthContext(): FluidAuthContextValue {\n const context = useContext(FluidAuthContext);\n\n if (!context) {\n throw new Error(\n \"useFluidAuthContext must be used within a FluidAuthProvider. \" +\n \"Wrap your app with <FluidAuthProvider> to use authentication features.\",\n );\n }\n\n return context;\n}\n\n/** Safe accessor — returns null when outside FluidAuthProvider (no throw) */\nexport function useFluidAuthOptional(): FluidAuthContextValue | null {\n return useContext(FluidAuthContext);\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\nexport {\n BulletListWidget,\n bulletListWidgetPropertySchema,\n} from \"./BulletListWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CardWidget, cardWidgetPropertySchema } from \"./CardWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { LinkWidget, linkWidgetPropertySchema } from \"./LinkWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport { PointsWidget, pointsWidgetPropertySchema } from \"./PointsWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport {\n SeparatorWidget,\n separatorWidgetPropertySchema,\n} from \"./SeparatorWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n BulletListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./BulletListWidget\").then((m) => m.bulletListWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CardWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CardWidget\").then((m) => m.cardWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n LinkWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LinkWidget\").then((m) => m.linkWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n PointsWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./PointsWidget\").then((m) => m.pointsWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SeparatorWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SeparatorWidget\").then((m) => m.separatorWidgetPropertySchema),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n QueryClient,\n QueryClientProvider,\n useQuery,\n} from \"@tanstack/react-query\";\nimport {\n customersApi,\n createFetchClient as createFluidPayFetchClient,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { createFluidClient, type FluidClient } from \"../client/fluid-client\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { useFluidAuthOptional } from \"./FluidAuthProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/portal-widgets/contexts\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../client/types\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** Configured API client instance */\n readonly client: FluidClient;\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Portal SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{\n * baseUrl: \"https://api.fluid.app/api\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps): React.JSX.Element {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(() => {\n const persister =\n typeof window !== \"undefined\" && !import.meta.env?.DEV\n ? createPersister()\n : undefined;\n\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n persister: persister?.persisterFn,\n },\n },\n });\n }, []);\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Recreate client only when baseUrl changes (primitive dependency).\n // Wrap callbacks in closures so they always read the latest from configRef,\n // avoiding stale captures when parent passes new getAuthToken/onAuthError.\n const client = useMemo(\n () =>\n createFluidClient({\n ...configRef.current,\n getAuthToken: () => configRef.current.getAuthToken?.() ?? null,\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Context value only changes when client changes\n const contextValue = useMemo(\n () => ({ client, config: configRef.current }) satisfies FluidContextValue,\n [client],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // getAuthToken is typically a synchronous cookie/localStorage read,\n // so we call it and use the result if it's a string (not a Promise).\n const getApiHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const getAuthToken = configRef.current.getAuthToken;\n if (typeof getAuthToken === \"function\") {\n const tokenOrPromise = getAuthToken();\n // Only use synchronous results — async tokens are handled by the SDK client\n if (typeof tokenOrPromise === \"string\") {\n headers.Authorization = `Bearer ${tokenOrPromise}`;\n }\n }\n\n return headers;\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Auto-derive rep_id from auth context for data source path interpolation\n const authContext = useFluidAuthOptional();\n\n const autoVariables = useMemo(() => {\n if (authContext?.user?.id != null) {\n return {\n rep_id: String(authContext.user.id),\n ...(authContext.user.company_id != null && {\n company_id: String(authContext.user.company_id),\n }),\n };\n }\n return undefined;\n }, [authContext?.user?.id, authContext?.user?.company_id]);\n\n // Explicit prop takes precedence over auto-derived variables\n const effectiveVariables = variables ?? autoVariables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <CustomerIdEnricher\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n registry={registry}\n themeProviderProps={themeProviderProps}\n onAuthError={config.onAuthError}\n >\n {children}\n </CustomerIdEnricher>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Inner component that enriches data source variables with customer_id.\n * Must be rendered inside FluidContext.Provider + QueryClientProvider.\n * Inlines the customer account fetch to avoid a circular dependency\n * (FluidProvider → useCustomerAccount → useFluidPayClient → FluidProvider).\n */\nfunction CustomerIdEnricher({\n baseUrl,\n getApiHeaders,\n variables,\n registry,\n themeProviderProps,\n onAuthError,\n children,\n}: {\n baseUrl: string;\n getApiHeaders: () => Record<string, string>;\n variables: Record<string, string> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registry: Record<string, React.ComponentType<any>>;\n themeProviderProps: Record<string, unknown>;\n onAuthError: (() => void) | undefined;\n children: ReactNode;\n}): React.JSX.Element {\n const authContext = useFluidAuthOptional();\n const token = authContext?.token ?? \"\";\n const userId = authContext?.user?.id;\n\n const fluidPayClient = useMemo(() => {\n const apiBase = baseUrl.endsWith(\"/api\")\n ? baseUrl\n : `${baseUrl.replace(/\\/+$/, \"\")}/api`;\n return createFluidPayFetchClient({\n baseUrl: apiBase,\n getAuthToken: () => token,\n onAuthError,\n });\n }, [baseUrl, token, onAuthError]);\n\n const { data: customerData } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(fluidPayClient, token),\n enabled: !!token,\n });\n const customerId = customerData?.customer?.id;\n\n const enrichedVariables = useMemo(() => {\n const base = variables ?? {};\n if (customerId == null) return variables;\n return { ...base, customer_id: String(customerId) };\n }, [variables, customerId]);\n\n return (\n <DataSourceRegistryProvider\n baseUrl={baseUrl}\n getApiHeaders={getApiHeaders}\n variables={enrichedVariables}\n >\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </DataSourceRegistryProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n"],"x_google_ignoreList":[2,3,4,5,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"mappings":"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"}
1
+ {"version":3,"file":"FluidProvider-BMxf7_8j.mjs","names":["ApiError","#provider","encode","decode","crypto","decode","importJWK","decodeBase64URL","asKeyObject","jwk.isJWK","jwk.isSecretJWK","isKeyLike","invalidKeyInput","jwk.isPrivateJWK","jwk.isPublicJWK","normalize","invalidKeyInput","crypto","getVerifyKey","subtleAlgorithm","crypto","base64url","secs","epoch","jwtPayload","base64url.encode","base64url.decode","base64url","fluidOs.getFluidOSManifest","createFluidPayFetchClient","customersApi.fetchCustomerAccount"],"sources":["../../../platform/api-client-core/src/fetch-client.ts","../../../fluid-pay/api-client/src/namespaces/customers.ts","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/utils.js","../../../../node_modules/.pnpm/@tanstack+query-core@5.90.12/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../../node_modules/.pnpm/@tanstack+query-persist-client-core@5.91.11/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js","../../../platform/query-persister/src/persister.ts","../../../api-clients/fluidos/src/namespaces/fluid_os.ts","../src/client/types.ts","../../../platform/auth/src/types.ts","../../../platform/auth/src/constants.ts","../../../platform/auth/src/browser-utils.ts","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/webcrypto.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/buffer_utils.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/errors.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/crypto_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/invalid_key_input.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/is_key_like.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_disjoint.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_object.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/check_key_length.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/is_jwk.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/jwk_to_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/normalize_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/key/import.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/check_key_type.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_crit.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/validate_algorithms.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/subtle_dsa.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/flattened/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jws/compact/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/epoch.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/secs.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/lib/jwt_claims_set.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwt/verify.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/local.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/runtime/fetch_jwks.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/jwks/remote.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/base64url.js","../../../../node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/browser/util/decode_jwt.js","../../../platform/auth/src/token-utils.ts","../../../platform/auth/src/token-storage.ts","../../../platform/auth/src/url-token.ts","../../../platform/auth/src/dev-utils.ts","../../../platform/auth/src/company-switch.ts","../../../platform/auth/src/auth-redirect.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/client/fluid-client.ts","../src/themes/index.ts","../src/providers/FluidThemeProvider.tsx","../src/providers/FluidAuthProvider.tsx","../../widgets/src/widgets/index.ts","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx"],"sourcesContent":["/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\nexport interface FetchClientInstance {\n request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n requestWithFormData: <TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n },\n ) => Promise<TResponse>;\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(\n config: FetchClientConfig,\n): FetchClientInstance {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n // Read body as text first to avoid SyntaxError from response.json()\n // when server returns non-JSON bodies with application/json content-type.\n const errorText = await response.text().catch(() => \"\");\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(errorText);\n } catch {\n throw new ApiError(\n errorText.slice(0, 200) ||\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n const msg = (data.message || data.error_message) as string | undefined;\n throw new ApiError(\n msg || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request: request,\n requestWithFormData: requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = FetchClientInstance;\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch the current customer's account info.\n * Endpoint: GET /fluid_pay/me?jwt={jwt}\n */\nexport async function fetchCustomerAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAccount> {\n return client.get(`/fluid_pay/me`, { jwt });\n}\n\n/**\n * Update customer profile (name, phone, language).\n * Endpoint: PATCH /fluid_pay/update_me?jwt={jwt}\n */\nexport async function updateCustomer(\n client: FetchClient,\n jwt: string,\n body: fluidPay.UpdateCustomerBody,\n): Promise<fluidPay.FluidPayAccountResponse> {\n return client.patch(`/fluid_pay/update_me?jwt=${jwt}`, {\n fluid_pay_account: body,\n });\n}\n","// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveEnabled(enabled, query) {\n return typeof enabled === \"function\" ? enabled(query) : enabled;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b) {\n if (a === b) {\n return a;\n }\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nexport {\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/createPersister.ts\nimport {\n hashKey,\n matchQuery,\n notifyManager,\n partialMatchKey\n} from \"@tanstack/query-core\";\nvar PERSISTER_KEY_PREFIX = \"tanstack-query\";\nfunction experimental_createQueryPersister({\n storage,\n buster = \"\",\n maxAge = 1e3 * 60 * 60 * 24,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n prefix = PERSISTER_KEY_PREFIX,\n refetchOnRestore = true,\n filters\n}) {\n function isExpiredOrBusted(persistedQuery) {\n if (persistedQuery.state.dataUpdatedAt) {\n const queryAge = Date.now() - persistedQuery.state.dataUpdatedAt;\n const expired = queryAge > maxAge;\n const busted = persistedQuery.buster !== buster;\n if (expired || busted) {\n return true;\n }\n return false;\n }\n return true;\n }\n async function retrieveQuery(queryHash, afterRestoreMacroTask) {\n if (storage != null) {\n const storageKey = `${prefix}-${queryHash}`;\n try {\n const storedData = await storage.getItem(storageKey);\n if (storedData) {\n const persistedQuery = await deserialize(storedData);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(storageKey);\n } else {\n if (afterRestoreMacroTask) {\n notifyManager.schedule(\n () => afterRestoreMacroTask(persistedQuery)\n );\n }\n return persistedQuery.state.data;\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(err);\n console.warn(\n \"Encountered an error attempting to restore query cache from persisted location.\"\n );\n }\n await storage.removeItem(storageKey);\n }\n }\n return;\n }\n async function persistQueryByKey(queryKey, queryClient) {\n if (storage != null) {\n const query = queryClient.getQueryCache().find({ queryKey });\n if (query) {\n await persistQuery(query);\n } else {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n \"Could not find query to be persisted. QueryKey:\",\n JSON.stringify(queryKey)\n );\n }\n }\n }\n }\n async function persistQuery(query) {\n if (storage != null) {\n const storageKey = `${prefix}-${query.queryHash}`;\n storage.setItem(\n storageKey,\n await serialize({\n state: query.state,\n queryKey: query.queryKey,\n queryHash: query.queryHash,\n buster\n })\n );\n }\n }\n async function persisterFn(queryFn, ctx, query) {\n const matchesFilter = filters ? matchQuery(filters, query) : true;\n if (matchesFilter && query.state.data === void 0 && storage != null) {\n const restoredData = await retrieveQuery(\n query.queryHash,\n (persistedQuery) => {\n query.setState({\n dataUpdatedAt: persistedQuery.state.dataUpdatedAt,\n errorUpdatedAt: persistedQuery.state.errorUpdatedAt\n });\n if (refetchOnRestore === \"always\" || refetchOnRestore === true && query.isStale()) {\n query.fetch();\n }\n }\n );\n if (restoredData !== void 0) {\n return Promise.resolve(restoredData);\n }\n }\n const queryFnResult = await queryFn(ctx);\n if (matchesFilter && storage != null) {\n notifyManager.schedule(() => {\n persistQuery(query);\n });\n }\n return Promise.resolve(queryFnResult);\n }\n async function persisterGc() {\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n }\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Garbage collection is not possible without ability to iterate over storage items.\"\n );\n }\n }\n async function restoreQueries(queryClient, filters2 = {}) {\n const { exact, queryKey } = filters2;\n if (storage?.entries) {\n const entries = await storage.entries();\n for (const [key, value] of entries) {\n if (key.startsWith(prefix)) {\n const persistedQuery = await deserialize(value);\n if (isExpiredOrBusted(persistedQuery)) {\n await storage.removeItem(key);\n continue;\n }\n if (queryKey) {\n if (exact) {\n if (persistedQuery.queryHash !== hashKey(queryKey)) {\n continue;\n }\n } else if (!partialMatchKey(persistedQuery.queryKey, queryKey)) {\n continue;\n }\n }\n queryClient.setQueryData(\n persistedQuery.queryKey,\n persistedQuery.state.data,\n {\n updatedAt: persistedQuery.state.dataUpdatedAt\n }\n );\n }\n }\n } else if (process.env.NODE_ENV === \"development\") {\n throw new Error(\n \"Provided storage does not implement `entries` method. Restoration of all stored entries is not possible without ability to iterate over storage items.\"\n );\n }\n }\n return {\n persisterFn,\n persistQuery,\n persistQueryByKey,\n retrieveQuery,\n persisterGc,\n restoreQueries\n };\n}\nexport {\n PERSISTER_KEY_PREFIX,\n experimental_createQueryPersister\n};\n//# sourceMappingURL=createPersister.js.map","import {\n type AsyncStorage,\n experimental_createQueryPersister,\n type PersistedQuery,\n} from \"@tanstack/react-query-persist-client\";\n\nconst DB_NAME = \"fluid_tanstack_query_cache\";\nconst STORE_NAME = \"fluid_queries\";\nconst VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\n// Exported for testing - allows resetting internal state between tests\nexport function _resetForTesting(): void {\n dbPromise = null;\n}\n\nexport async function deleteDatabase(reason: string = \"error\"): Promise<void> {\n return new Promise((resolve, reject) => {\n console.warn(`[IDB] Deleting database due to ${reason}`);\n const req = indexedDB.deleteDatabase(DB_NAME);\n req.onsuccess = () => {\n console.log(\"[IDB] Database deleted successfully\");\n dbPromise = null; // ensure next getDb() opens a fresh connection\n resolve();\n };\n req.onerror = () => {\n console.error(\"[IDB] Failed to delete database:\", req.error);\n reject(req.error ?? new Error(\"deleteDatabase failed\"));\n };\n req.onblocked = () => {\n console.warn(\"[IDB] Delete blocked: close all tabs using this database\");\n // Resolve anyway so callers (e.g. clearCompanyCache) don't hang\n // indefinitely. The delete will complete once blocking connections close.\n dbPromise = null; // best-effort: allow fresh open on next access\n resolve();\n };\n });\n}\n\nfunction openDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, VERSION);\n\n req.onupgradeneeded = () => {\n const upgradeDb = req.result;\n if (!upgradeDb.objectStoreNames.contains(STORE_NAME)) {\n upgradeDb.createObjectStore(STORE_NAME);\n }\n };\n\n req.onsuccess = () => {\n const conn = req.result;\n conn.onversionchange = () => {\n console.trace(\"[IDB] version change – closing connection\");\n conn.close();\n // clear the cached promise so the next getDb call re-opens a connection\n dbPromise = null;\n };\n resolve(conn);\n };\n\n req.onblocked = () => {\n console.warn(\"[IDB] open blocked: another connection is holding the DB\");\n };\n\n req.onerror = () => {\n reject(\n req.error instanceof Error\n ? req.error\n : new Error(`IndexedDB open failed: ${String(req.error)}`),\n );\n };\n });\n}\n\nasync function getDbWithRecovery(): Promise<IDBDatabase> {\n try {\n return await openDatabase();\n } catch (err) {\n // First open failed - try to delete and recreate\n console.warn(\"[IDB] Initial open failed, attempting recovery:\", err);\n try {\n await deleteDatabase();\n console.log(\"[IDB] Retrying database open after deletion\");\n return await openDatabase();\n } catch (retryErr) {\n console.error(\"[IDB] Recovery failed:\", retryErr);\n throw retryErr;\n }\n }\n}\n\nfunction getDb(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise;\n\n // Create the promise and cache it immediately to prevent race conditions\n // All concurrent calls will share this same promise\n dbPromise = getDbWithRecovery().catch((err) => {\n // On failure, clear the cache so next call can retry fresh\n dbPromise = null;\n throw err;\n });\n\n return dbPromise;\n}\n\n// Exported for testing - allows direct testing of storage operations\nexport const storage: AsyncStorage<PersistedQuery> = {\n async getItem(key: string) {\n try {\n const db = await getDb();\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n // Transaction creation failed (e.g., stale connection)\n console.trace(\"[IDB] getItem transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] getItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n return new Promise<PersistedQuery | undefined>((res) => {\n try {\n const r = db\n .transaction(STORE_NAME, \"readonly\")\n .objectStore(STORE_NAME)\n .get(key);\n r.onsuccess = () => res(r.result as PersistedQuery);\n r.onerror = () => {\n console.trace(\"[IDB] getItem retry error:\", r.error);\n res(undefined);\n };\n } catch (txErr) {\n console.trace(\"[IDB] getItem retry transaction error:\", txErr);\n res(undefined);\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] getItem recovery failed:\", recoveryErr);\n }\n return undefined;\n }\n },\n\n async setItem(key: string, value: PersistedQuery) {\n // JSON round-trip strips non-cloneable properties (functions, class instances)\n // before IndexedDB's structured clone algorithm runs. Without this, IDB\n // throws DataCloneError. Theme Color objects are now kept out of the cache\n // via the select pattern, but other queries may still have non-cloneable data.\n const cloneableValue = JSON.parse(JSON.stringify(value));\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] setItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .put(cloneableValue, key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] setItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] setItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] setItem recovery failed:\", recoveryErr);\n }\n }\n },\n\n async removeItem(key: string) {\n try {\n const db = await getDb();\n if (!db) return;\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem transaction error:\", txErr);\n resolve();\n }\n });\n } catch (err) {\n // getDb() failed - try to recover with a fresh connection\n console.trace(\"[IDB] removeItem getDb error:\", err);\n try {\n const db = await getDb();\n // Use fresh connection directly - getDb() already handles recovery\n await new Promise<void>((resolve) => {\n try {\n const req = db\n .transaction(STORE_NAME, \"readwrite\")\n .objectStore(STORE_NAME)\n .delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => {\n console.trace(\"[IDB] removeItem retry error:\", req.error);\n resolve();\n };\n } catch (txErr) {\n console.trace(\"[IDB] removeItem retry transaction error:\", txErr);\n resolve();\n }\n });\n } catch (recoveryErr) {\n console.trace(\"[IDB] removeItem recovery failed:\", recoveryErr);\n }\n }\n },\n};\n\n// Factory function to create persister - only call this client-side\nexport function createPersister(): ReturnType<\n typeof experimental_createQueryPersister\n> {\n return experimental_createQueryPersister<PersistedQuery>({\n storage,\n serialize: (persistedQuery) => persistedQuery,\n deserialize: (cached) => cached,\n });\n}\n","/**\n * Generated API client functions for fluid_os\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/fluid_os\";\n\n// ============================================================================\n// Fluid OS - Definitions\n// ============================================================================\n\n/**\n * List Fluid OS definitions\n * Retrieve a list of Fluid OS definitions for the current company\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listFluidOSDefinitions(\n client: FetchClient,\n params?: operations[\"listFluidOSDefinitions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSDefinitions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions`, params);\n}\n\n/**\n * Create a Fluid OS definition\n * Create a new Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createFluidOSDefinition(\n client: FetchClient,\n body: operations[\"createFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/fluid_os/definitions`, body);\n}\n\n/**\n * Get a Fluid OS definition\n * Retrieve a specific Fluid OS definition with all associations\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions/${id}`);\n}\n\n/**\n * Update a Fluid OS definition\n * Update an existing Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/company/fluid_os/definitions/${id}`, body);\n}\n\n/**\n * Delete a Fluid OS definition\n * Delete a Definition\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/fluid_os/definitions/${id}`);\n}\n\n// ============================================================================\n// Fluid OS - Navigation Items\n// ============================================================================\n\n/**\n * List navigation items for a navigation\n * Retrieve a list of navigation items for a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n */\nexport async function listFluidOSNavigationItems(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n): Promise<\n operations[\"listFluidOSNavigationItems\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n );\n}\n\n/**\n * Create a navigation item\n * Create a new navigation item for a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param body - body\n */\nexport async function createFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n body: operations[\"createFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n body,\n );\n}\n\n/**\n * Get a specific navigation item\n * Retrieve a specific navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function getFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n/**\n * Update a navigation item\n * Update an existing navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation item\n * Delete a navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Navigations\n// ============================================================================\n\n/**\n * List navigations for a Fluid OS definition\n * Retrieve a list of navigations for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSNavigations(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSNavigations\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSNavigations\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n params,\n );\n}\n\n/**\n * Create a navigation for a Fluid OS definition\n * Create a new navigation for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n body,\n );\n}\n\n/**\n * Get a specific navigation\n * Retrieve a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n/**\n * Update a navigation\n * Update an existing navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation\n * Delete a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Profiles\n// ============================================================================\n\n/**\n * List profiles for a Fluid OS definition\n * Retrieve a list of profiles for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSProfiles(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSProfiles\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSProfiles\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n params,\n );\n}\n\n/**\n * Create a profile for a Fluid OS definition\n * Create a new profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n body,\n );\n}\n\n/**\n * Get the default profile\n * Retrieve the default profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function getDefaultFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"getDefaultFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/default`,\n );\n}\n\n/**\n * Get a specific profile\n * Retrieve a specific profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n/**\n * Update a profile\n * Update an existing profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n body,\n );\n}\n\n/**\n * Delete a profile\n * Delete a profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Public\n// ============================================================================\n\n/**\n * Get active Fluid OS definition\n * Retrieve the active Fluid OS definition manifest for a specific platform\n *\n * @param client - Fetch client instance\n * @param params - params\n */\nexport async function getFluidOSManifest(\n client: FetchClient,\n params: operations[\"getFluidOSManifest\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getFluidOSManifest\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/fluid_os/definitions/active`, params);\n}\n\n// ============================================================================\n// Fluid OS - Screens\n// ============================================================================\n\n/**\n * List screens for a Fluid OS definition\n * Retrieve a list of screens for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSScreens(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSScreens\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSScreens\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n params,\n );\n}\n\n/**\n * Create a screen for a Fluid OS definition\n * Create a new screen for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n body,\n );\n}\n\n/**\n * Get a specific screen\n * Retrieve a specific screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n/**\n * Update a screen\n * Update an existing screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n body,\n );\n}\n\n/**\n * Delete a screen\n * Delete a screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Themes\n// ============================================================================\n\n/**\n * List themes for a Fluid OS definition\n * Retrieve a list of themes for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSThemes(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSThemes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSThemes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n params,\n );\n}\n\n/**\n * Create a theme for a Fluid OS definition\n * Create a new theme for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n body,\n );\n}\n\n/**\n * Get a specific theme\n * Retrieve a specific theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n/**\n * Update a theme\n * Update an existing theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n body,\n );\n}\n\n/**\n * Delete a theme\n * Delete a theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Versions\n// ============================================================================\n\n/**\n * List versions for a Fluid OS definition\n * Retrieve a list of published versions for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSVersions(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSVersions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSVersions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n params,\n );\n}\n\n/**\n * Publish a new version of a Fluid OS definition\n * Publish a new version of the Fluid OS definition. This creates a snapshot of the current definition state including all screens, profiles, themes, and navigations. No request body is required - the manifest is built automatically from the current definition state.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function createFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"createFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n );\n}\n\n/**\n * Get a specific version\n * Retrieve a specific published version including its manifest\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n );\n}\n\n/**\n * Update a version\n * Update a version. Currently only supports activating/deactivating a version.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSVersion\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n body,\n );\n}\n","// ============================================================================\n// HTTP Method Constants\n// ============================================================================\n\n/**\n * HTTP methods supported by the API client.\n * Use `as const` for literal type inference and type safety.\n */\nexport const HTTP_METHODS = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n PATCH: \"PATCH\",\n DELETE: \"DELETE\",\n} as const;\n\n/**\n * Union type of all supported HTTP methods.\n * Derived from HTTP_METHODS constant to avoid duplication.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[keyof typeof HTTP_METHODS];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Fluid SDK client.\n * Use Readonly<FluidSDKConfig> when the config should not be modified after creation.\n */\nexport interface FluidSDKConfig {\n /**\n * Base URL for the Fluid API domain (e.g., \"https://api.fluid.app\").\n * Endpoints include their full path from root (e.g., \"/api/me\").\n */\n readonly baseUrl: string;\n\n /**\n * Function to retrieve the authentication token\n * Return null/undefined if no token is available\n */\n readonly getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Callback invoked when a 401 authentication error occurs\n * Use this to trigger re-authentication flows\n */\n readonly onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"portal\" }\n */\n readonly defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Filestack API key for messaging file uploads.\n * If not provided, file attachments will be disabled in the messaging composer.\n */\n readonly filestackApiKey?: string;\n\n /**\n * Override WebSocket URL for real-time messaging.\n * Default: derived from baseUrl by replacing trailing /api with /cable\n */\n readonly websocketUrl?: string;\n\n /**\n * ISO country code for the store/merchant (e.g., \"US\", \"CA\", \"GB\").\n * Used to fetch country-specific payment methods.\n * @default \"US\"\n */\n readonly countryIso?: string;\n}\n\n/**\n * Options for individual API requests.\n * Uses HttpMethod type for method to ensure type safety.\n */\nexport interface RequestOptions {\n readonly method?: HttpMethod;\n readonly body?: unknown;\n readonly params?: Readonly<Record<string, unknown>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\n/**\n * Pagination parameters for list endpoints\n */\nexport interface PaginationParams {\n readonly page?: number;\n readonly per_page?: number;\n}\n\n// ============================================================================\n// Sort Order - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * Sort order constant - single source of truth for sort direction values.\n * Use SORT_ORDERS.asc instead of \"asc\" for type-safe comparisons.\n */\nexport const SORT_ORDERS = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\n/**\n * Union type of sort order values, derived from SORT_ORDERS constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type SortOrder = (typeof SORT_ORDERS)[keyof typeof SORT_ORDERS];\n\n/**\n * Common filter parameters for list endpoints\n */\nexport interface BaseListParams extends PaginationParams {\n readonly sort_by?: string;\n readonly sort_order?: SortOrder;\n readonly search?: string;\n}\n","/**\n * Auth Types\n *\n * These types define the JWT payload structure and authentication\n * configuration options.\n */\n\n// ============================================================================\n// User Types - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * User type constant - single source of truth for user role values.\n * Use USER_TYPES.admin instead of \"admin\" for type-safe comparisons.\n */\nexport const USER_TYPES = {\n admin: \"admin\",\n rep: \"rep\",\n root_admin: \"root_admin\",\n customer: \"customer\",\n} as const;\n\n/**\n * Union type of all user types, derived from USER_TYPES constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type UserType = (typeof USER_TYPES)[keyof typeof USER_TYPES];\n\n/**\n * Runtime validation for user types.\n * @param value - The value to check\n * @returns true if value is a valid UserType\n */\nexport function isUserType(value: string): value is UserType {\n return Object.values(USER_TYPES).includes(value as UserType);\n}\n\n/**\n * JWT payload structure from Fluid Commerce authentication.\n * Contains user identity and role information.\n */\nexport interface JWTPayload {\n /** User ID */\n id?: number | undefined;\n /** User email address */\n email?: string | undefined;\n /** Full name of the user */\n full_name?: string | undefined;\n /** User role type */\n user_type: UserType;\n /** Original user type (for impersonation scenarios) */\n og_user_type?: UserType | undefined;\n /** Company ID the user belongs to */\n company_id?: number | undefined;\n /** Token expiration timestamp (Unix seconds) */\n exp?: number | undefined;\n /** Authentication type (e.g., \"standard\", \"impersonation\") */\n auth_type?: string | undefined;\n}\n\n/**\n * Configuration options for FluidAuthProvider.\n * All options have sensible defaults.\n */\nexport interface FluidAuthConfig {\n /**\n * URL parameter name for the auth token.\n * @default \"fluidUserToken\"\n */\n tokenKey?: string;\n\n /**\n * Cookie name for storing the auth token.\n * @default \"auth_token\"\n */\n cookieKey?: string;\n\n /**\n * Cookie max age in seconds.\n * @default 777600 (9 days)\n */\n cookieMaxAge?: number;\n\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration.\n * @default 30000 (30 seconds)\n */\n gracePeriodMs?: number;\n\n /**\n * Callback invoked when authentication fails (no valid token).\n * When omitted, the SDK redirects to `authUrl` with the current URL\n * as a redirect parameter so users can log in and return.\n */\n onAuthFailure?: () => void;\n\n /**\n * Base URL for the authentication page.\n * Used by the default auth failure redirect when `onAuthFailure` is not provided.\n * Ignored when a custom `onAuthFailure` callback is set.\n * @default \"https://auth.fluid.app\"\n */\n authUrl?: string;\n\n /**\n * Enable dev-mode auth bypass.\n * When true AND running in Vite dev mode (import.meta.env.DEV),\n * auth will use a synthetic mock user instead of requiring a real JWT.\n * The mock user allows UI rendering but API calls will fail (token is null).\n * @default false\n */\n devBypass?: boolean;\n\n /**\n * JWKS (JSON Web Key Set) URL for signature verification.\n * When provided, JWT signatures will be verified against keys\n * from this endpoint before accepting the token.\n *\n * This provides defense-in-depth client-side verification.\n * Without this, tokens are only decoded (not verified) client-side,\n * and real verification happens server-side on API calls.\n *\n * @example \"https://api.fluid.app/.well-known/jwks.json\"\n */\n jwksUrl?: string;\n}\n\n/**\n * Value provided by the FluidAuthContext.\n * All properties are readonly since context values should not be mutated by consumers.\n */\nexport interface FluidAuthContextValue {\n /** Whether the user is authenticated with a valid token */\n readonly isAuthenticated: boolean;\n /** Whether authentication is still being initialized */\n readonly isLoading: boolean;\n /** Decoded JWT payload if authenticated, null otherwise */\n readonly user: JWTPayload | null;\n /** Raw JWT token string if authenticated, null otherwise */\n readonly token: string | null;\n /** Clear authentication state and stored tokens */\n readonly clearAuth: () => void;\n /** Authentication error if any occurred during initialization */\n readonly error: Error | null;\n}\n\n/**\n * Result of token validation.\n * Uses a discriminated union for type-safe handling of valid/invalid states.\n */\nexport type TokenValidationResult =\n | {\n /** Token is valid */\n isValid: true;\n /** Decoded JWT payload */\n payload: JWTPayload;\n /** No error when valid */\n error?: undefined;\n }\n | {\n /** Token is invalid */\n isValid: false;\n /** Decoded JWT payload if parseable but expired */\n payload?: JWTPayload;\n /** Error message explaining why validation failed */\n error: string;\n };\n","/**\n * Auth Constants\n *\n * These constants define the default values for authentication\n * configuration and storage keys.\n */\n\n/**\n * Authentication-related constants with sensible defaults.\n */\nexport const AUTH_CONSTANTS = {\n /**\n * Grace period in milliseconds to account for clock skew\n * when checking token expiration. Tokens are considered valid\n * if they expire within this period.\n */\n TOKEN_GRACE_PERIOD_MS: 30_000, // 30 seconds\n\n /**\n * Default cookie max age in seconds (9 days).\n * This matches the typical JWT token lifetime from the Fluid API.\n */\n COOKIE_MAX_AGE: 777_600, // 9 days in seconds (9 * 24 * 60 * 60)\n} as const;\n\n/**\n * Storage keys for auth tokens.\n */\nexport const STORAGE_KEYS = {\n /** localStorage key for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** localStorage key for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n /** Cookie name for auth token */\n AUTH_COOKIE: \"auth_token\",\n} as const;\n\n/**\n * Default URL parameter names for token extraction.\n */\nexport const URL_PARAMS = {\n /** URL parameter name for user token */\n USER_TOKEN: \"fluidUserToken\",\n /** URL parameter name for company token (legacy) */\n COMPANY_TOKEN: \"fluidCompanyToken\",\n} as const;\n","/**\n * Browser environment detection utility.\n * Shared across auth modules to avoid duplication.\n */\n\n/**\n * Check if we're running in a browser environment.\n * Checks both `window` and `document` to ensure full DOM availability.\n */\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n","export default crypto;\nexport const isCryptoKey = (key) => key instanceof CryptoKey;\n","import digest from '../runtime/digest.js';\nexport const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nexport function p2s(alg, p2sInput) {\n return concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function lengthAndInput(input) {\n return concat(uint32be(input.length), input);\n}\nexport async function concatKdf(secret, bits, value) {\n const iterations = Math.ceil((bits >> 3) / 32);\n const res = new Uint8Array(iterations * 32);\n for (let iter = 0; iter < iterations; iter++) {\n const buf = new Uint8Array(4 + secret.length + value.length);\n buf.set(uint32be(iter + 1));\n buf.set(secret, 4);\n buf.set(value, 4 + secret.length);\n res.set(await digest('sha256', buf), iter * 32);\n }\n return res.slice(0, bits >> 3);\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nexport const encodeBase64 = (input) => {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < unencoded.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, unencoded.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n};\nexport const encode = (input) => {\n return encodeBase64(input).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\nexport const decodeBase64 = (encoded) => {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n};\nexport const decode = (input) => {\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n};\n","export class JOSEError extends Error {\n constructor(message, options) {\n super(message, options);\n this.code = 'ERR_JOSE_GENERIC';\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nJOSEError.code = 'ERR_JOSE_GENERIC';\nexport class JWTClaimValidationFailed extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTClaimValidationFailed.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\nexport class JWTExpired extends JOSEError {\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.code = 'ERR_JWT_EXPIRED';\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nJWTExpired.code = 'ERR_JWT_EXPIRED';\nexport class JOSEAlgNotAllowed extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n }\n}\nJOSEAlgNotAllowed.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\nexport class JOSENotSupported extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JOSE_NOT_SUPPORTED';\n }\n}\nJOSENotSupported.code = 'ERR_JOSE_NOT_SUPPORTED';\nexport class JWEDecryptionFailed extends JOSEError {\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n this.code = 'ERR_JWE_DECRYPTION_FAILED';\n }\n}\nJWEDecryptionFailed.code = 'ERR_JWE_DECRYPTION_FAILED';\nexport class JWEInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWE_INVALID';\n }\n}\nJWEInvalid.code = 'ERR_JWE_INVALID';\nexport class JWSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWS_INVALID';\n }\n}\nJWSInvalid.code = 'ERR_JWS_INVALID';\nexport class JWTInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWT_INVALID';\n }\n}\nJWTInvalid.code = 'ERR_JWT_INVALID';\nexport class JWKInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWK_INVALID';\n }\n}\nJWKInvalid.code = 'ERR_JWK_INVALID';\nexport class JWKSInvalid extends JOSEError {\n constructor() {\n super(...arguments);\n this.code = 'ERR_JWKS_INVALID';\n }\n}\nJWKSInvalid.code = 'ERR_JWKS_INVALID';\nexport class JWKSNoMatchingKey extends JOSEError {\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_NO_MATCHING_KEY';\n }\n}\nJWKSNoMatchingKey.code = 'ERR_JWKS_NO_MATCHING_KEY';\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n this.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n }\n}\nSymbol.asyncIterator;\nJWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\nexport class JWKSTimeout extends JOSEError {\n constructor(message = 'request timed out', options) {\n super(message, options);\n this.code = 'ERR_JWKS_TIMEOUT';\n }\n}\nJWKSTimeout.code = 'ERR_JWKS_TIMEOUT';\nexport class JWSSignatureVerificationFailed extends JOSEError {\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n this.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n }\n}\nJWSSignatureVerificationFailed.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n","function unusable(name, prop = 'algorithm.name') {\n return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\n}\nfunction isAlgorithm(algorithm, name) {\n return algorithm.name === name;\n}\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usages) {\n if (usages.length && !usages.some((expected) => key.usages.includes(expected))) {\n let msg = 'CryptoKey does not support this operation, its usages must include ';\n if (usages.length > 2) {\n const last = usages.pop();\n msg += `one of ${usages.join(', ')}, or ${last}.`;\n }\n else if (usages.length === 2) {\n msg += `one of ${usages[0]} or ${usages[1]}.`;\n }\n else {\n msg += `${usages[0]}.`;\n }\n throw new TypeError(msg);\n }\n}\nexport function checkSigCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'EdDSA': {\n if (key.algorithm.name !== 'Ed25519' && key.algorithm.name !== 'Ed448') {\n throw unusable('Ed25519 or Ed448');\n }\n break;\n }\n case 'Ed25519': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\nexport function checkEncCryptoKey(key, alg, ...usages) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n case 'X448':\n break;\n default:\n throw unusable('ECDH, X25519, or X448');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usages);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport default (actual, ...types) => {\n return message('Key must be ', actual, ...types);\n};\nexport function withAlg(alg, actual, ...types) {\n return message(`Key for the ${alg} algorithm must be `, actual, ...types);\n}\n","import { isCryptoKey } from './webcrypto.js';\nexport default (key) => {\n if (isCryptoKey(key)) {\n return true;\n }\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nexport const types = ['CryptoKey'];\n","const isDisjoint = (...headers) => {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n};\nexport default isDisjoint;\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\n","export default (alg, key) => {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n};\n","import isObject from './is_object.js';\nexport function isJWK(key) {\n return isObject(key) && typeof key.kty === 'string';\n}\nexport function isPrivateJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'string';\n}\nexport function isPublicJWK(key) {\n return key.kty !== 'oct' && typeof key.d === 'undefined';\n}\nexport function isSecretJWK(key) {\n return isJWK(key) && key.kty === 'oct' && typeof key.k === 'string';\n}\n","import crypto from './webcrypto.js';\nimport { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'EdDSA':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nconst parse = async (jwk) => {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const rest = [\n algorithm,\n jwk.ext ?? false,\n jwk.key_ops ?? keyUsages,\n ];\n const keyData = { ...jwk };\n delete keyData.alg;\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, ...rest);\n};\nexport default parse;\n","import { isJWK } from '../lib/is_jwk.js';\nimport { decode } from './base64url.js';\nimport importJWK from './jwk_to_key.js';\nconst exportKeyValue = (k) => decode(k);\nlet privCache;\nlet pubCache;\nconst isKeyObject = (key) => {\n return key?.[Symbol.toStringTag] === 'KeyObject';\n};\nconst importAndCache = async (cache, key, jwk, alg, freeze = false) => {\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await importJWK({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst normalizePublicKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n delete jwk.d;\n delete jwk.dp;\n delete jwk.dq;\n delete jwk.p;\n delete jwk.q;\n delete jwk.qi;\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n pubCache || (pubCache = new WeakMap());\n return importAndCache(pubCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n pubCache || (pubCache = new WeakMap());\n const cryptoKey = importAndCache(pubCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nconst normalizePrivateKey = (key, alg) => {\n if (isKeyObject(key)) {\n let jwk = key.export({ format: 'jwk' });\n if (jwk.k) {\n return exportKeyValue(jwk.k);\n }\n privCache || (privCache = new WeakMap());\n return importAndCache(privCache, key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k)\n return decode(key.k);\n privCache || (privCache = new WeakMap());\n const cryptoKey = importAndCache(privCache, key, key, alg, true);\n return cryptoKey;\n }\n return key;\n};\nexport default { normalizePublicKey, normalizePrivateKey };\n","import { decode as decodeBase64URL } from '../runtime/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../runtime/asn1.js';\nimport asKeyObject from '../runtime/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n alg || (alg = jwk.alg);\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n case 'EC':\n case 'OKP':\n return asKeyObject({ ...jwk, alg });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport isKeyLike, { types } from '../runtime/is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined && key.use !== 'sig') {\n throw new TypeError('Invalid key for this operation, when present its use must be sig');\n }\n if (key.key_ops !== undefined && key.key_ops.includes?.(usage) !== true) {\n throw new TypeError(`Invalid key for this operation, when present its key_ops must include ${usage}`);\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, when present its alg must be ${alg}`);\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (key instanceof Uint8Array)\n return;\n if (allowJwk && jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, 'Uint8Array', allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage, allowJwk) => {\n if (allowJwk && jwk.isJWK(key)) {\n switch (usage) {\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a private JWK`);\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, ...types, allowJwk ? 'JSON Web Key' : null));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (usage === 'sign' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n }\n if (usage === 'decrypt' && key.type === 'public') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n if (key.algorithm && usage === 'verify' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n }\n if (key.algorithm && usage === 'encrypt' && key.type === 'private') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n};\nfunction checkKeyType(allowJwk, alg, key, usage) {\n const symmetric = alg.startsWith('HS') ||\n alg === 'dir' ||\n alg.startsWith('PBES2') ||\n /^A\\d{3}(?:GCM)?KW$/.test(alg);\n if (symmetric) {\n symmetricTypeCheck(alg, key, usage, allowJwk);\n }\n else {\n asymmetricTypeCheck(alg, key, usage, allowJwk);\n }\n}\nexport default checkKeyType.bind(undefined, false);\nexport const checkKeyTypeWithJwk = checkKeyType.bind(undefined, true);\n","import { JOSENotSupported } from '../util/errors.js';\nfunction validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\nexport default validateCrit;\n","const validateAlgorithms = (option, algorithms) => {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n};\nexport default validateAlgorithms;\n","import { JOSENotSupported } from '../util/errors.js';\nexport default function subtleDsa(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: alg.slice(-3) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n return { name: 'Ed25519' };\n case 'EdDSA':\n return { name: algorithm.name };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\n","import crypto, { isCryptoKey } from './webcrypto.js';\nimport { checkSigCryptoKey } from '../lib/crypto_key.js';\nimport invalidKeyInput from '../lib/invalid_key_input.js';\nimport { types } from './is_key_like.js';\nimport normalize from './normalize_key.js';\nexport default async function getCryptoKey(alg, key, usage) {\n if (usage === 'sign') {\n key = await normalize.normalizePrivateKey(key, alg);\n }\n if (usage === 'verify') {\n key = await normalize.normalizePublicKey(key, alg);\n }\n if (isCryptoKey(key)) {\n checkSigCryptoKey(key, alg, usage);\n return key;\n }\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, ...types));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n throw new TypeError(invalidKeyInput(key, ...types, 'Uint8Array', 'JSON Web Key'));\n}\n","import subtleAlgorithm from './subtle_dsa.js';\nimport crypto from './webcrypto.js';\nimport checkKeyLength from './check_key_length.js';\nimport getVerifyKey from './get_sign_verify_key.js';\nconst verify = async (alg, key, signature, data) => {\n const cryptoKey = await getVerifyKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n};\nexport default verify;\n","import { decode as base64url } from '../../runtime/base64url.js';\nimport verify from '../../runtime/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder } from '../../lib/buffer_utils.js';\nimport isDisjoint from '../../lib/is_disjoint.js';\nimport isObject from '../../lib/is_object.js';\nimport { checkKeyTypeWithJwk } from '../../lib/check_key_type.js';\nimport validateCrit from '../../lib/validate_crit.js';\nimport validateAlgorithms from '../../lib/validate_algorithms.js';\nimport { isJWK } from '../../lib/is_jwk.js';\nimport { importJWK } from '../../key/import.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = base64url(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n checkKeyTypeWithJwk(alg, key, 'verify');\n if (isJWK(key)) {\n key = await importJWK(key, alg);\n }\n }\n else {\n checkKeyTypeWithJwk(alg, key, 'verify');\n }\n const data = concat(encoder.encode(jws.protected ?? ''), encoder.encode('.'), typeof jws.payload === 'string' ? encoder.encode(jws.payload) : jws.payload);\n let signature;\n try {\n signature = base64url(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const verified = await verify(alg, key, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = base64url(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","export default (date) => Math.floor(date.getTime() / 1000);\n","const minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport default (str) => {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n};\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { decoder } from './buffer_utils.js';\nimport epoch from './epoch.js';\nimport secs from './secs.js';\nimport isObject from './is_object.js';\nconst normalizeTyp = (value) => value.toLowerCase().replace(/^application\\//, '');\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport default (protectedHeader, encodedPayload, options = {}) => {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n};\n","import { compactVerify } from '../jws/compact/verify.js';\nimport jwtPayload from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = jwtPayload(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport isObject from '../lib/is_object.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nfunction clone(obj) {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\nclass LocalJWKSet {\n constructor(jwks) {\n this._cached = new WeakMap();\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this._jwks = clone(jwks);\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this._jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && typeof jwk.alg === 'string') {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES256K':\n candidate = jwk.crv === 'secp256k1';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n candidate = jwk.crv === 'Ed25519';\n break;\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519' || jwk.crv === 'Ed448';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const { _cached } = this;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this._cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => clone(set._jwks),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSTimeout } from '../util/errors.js';\nconst fetchJwks = async (url, timeout, options) => {\n let controller;\n let id;\n let timedOut = false;\n if (typeof AbortController === 'function') {\n controller = new AbortController();\n id = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeout);\n }\n const response = await fetch(url.href, {\n signal: controller ? controller.signal : undefined,\n redirect: 'manual',\n headers: options.headers,\n }).catch((err) => {\n if (timedOut)\n throw new JWKSTimeout();\n throw err;\n });\n if (id !== undefined)\n clearTimeout(id);\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n};\nexport default fetchJwks;\n","import fetchJwks from '../runtime/fetch_jwks.js';\nimport { JWKSNoMatchingKey } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport isObject from '../lib/is_object.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v5.10.0';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this._url = new URL(url.href);\n this._options = { agent: options?.agent, headers: options?.headers };\n this._timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this._cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this._cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n if (options?.[jwksCache] !== undefined) {\n this._cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this._cacheMaxAge)) {\n this._jwksTimestamp = this._cache.uat;\n this._local = createLocalJWKSet(this._cache.jwks);\n }\n }\n }\n coolingDown() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cooldownDuration\n : false;\n }\n fresh() {\n return typeof this._jwksTimestamp === 'number'\n ? Date.now() < this._jwksTimestamp + this._cacheMaxAge\n : false;\n }\n async getKey(protectedHeader, token) {\n if (!this._local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this._local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this._local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this._pendingFetch && isCloudflareWorkers()) {\n this._pendingFetch = undefined;\n }\n const headers = new Headers(this._options.headers);\n if (USER_AGENT && !headers.has('User-Agent')) {\n headers.set('User-Agent', USER_AGENT);\n this._options.headers = Object.fromEntries(headers.entries());\n }\n this._pendingFetch || (this._pendingFetch = fetchJwks(this._url, this._timeoutDuration, this._options)\n .then((json) => {\n this._local = createLocalJWKSet(json);\n if (this._cache) {\n this._cache.uat = Date.now();\n this._cache.jwks = json;\n }\n this._jwksTimestamp = Date.now();\n this._pendingFetch = undefined;\n })\n .catch((err) => {\n this._pendingFetch = undefined;\n throw err;\n }));\n await this._pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => !!set._pendingFetch,\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set._local?.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\nexport const experimental_jwksCache = jwksCache;\n","import * as base64url from '../runtime/base64url.js';\nexport const encode = base64url.encode;\nexport const decode = base64url.decode;\n","import { decode as base64url } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport isObject from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = base64url(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","/**\n * Token Utilities\n *\n * Functions for decoding, validating, and checking JWT tokens.\n */\n\nimport {\n decodeJwt,\n jwtVerify,\n createRemoteJWKSet,\n type JWTPayload as JoseJWTPayload,\n} from \"jose\";\nimport { AUTH_CONSTANTS } from \"./constants\";\nimport type { JWTPayload, TokenValidationResult } from \"./types\";\nimport { isUserType } from \"./types\";\n\n/**\n * Extract a JWTPayload from a jose-decoded JWT payload.\n *\n * Type assertions are required because jose's payload type uses `unknown`\n * for custom claims. This helper centralises the mapping so that\n * both {@link decodeToken} and {@link verifyToken} share the same logic.\n */\nfunction extractPayloadFromJose(\n decoded: JoseJWTPayload & Partial<JWTPayload>,\n): JWTPayload {\n const rawUserType = decoded.user_type;\n const rawOgUserType = decoded.og_user_type;\n\n return {\n id: typeof decoded.id === \"number\" ? decoded.id : undefined,\n email: typeof decoded.email === \"string\" ? decoded.email : undefined,\n full_name:\n typeof decoded.full_name === \"string\" ? decoded.full_name : undefined,\n user_type:\n typeof rawUserType === \"string\" && isUserType(rawUserType)\n ? rawUserType\n : \"rep\",\n og_user_type:\n typeof rawOgUserType === \"string\" && isUserType(rawOgUserType)\n ? rawOgUserType\n : undefined,\n company_id:\n typeof decoded.company_id === \"number\" ? decoded.company_id : undefined,\n exp: decoded.exp,\n auth_type:\n typeof decoded.auth_type === \"string\" ? decoded.auth_type : undefined,\n };\n}\n\n/**\n * Decode a JWT token and extract its payload.\n *\n * **Security note:** This function does NOT verify the JWT signature.\n * It only decodes the payload. Any valid JWT structure will be accepted,\n * regardless of who signed it.\n *\n * Client-side token decoding is used for UX purposes only (displaying\n * user info, role-based UI). The real security boundary is the server-side\n * API, which verifies the signature on every request.\n *\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @returns The decoded JWT payload, or null if decoding fails\n */\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n // Type assertion required: jose's decodeJwt returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = decodeJwt(token) as JoseJWTPayload & Partial<JWTPayload>;\n\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] Failed to decode JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Check if a token has expired.\n * Includes a configurable grace period to account for clock skew.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period in milliseconds (default: 30 seconds)\n * @returns true if the token is expired, false otherwise\n */\nexport function isTokenExpired(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): boolean {\n try {\n const decoded = decodeJwt(token);\n\n // If no expiration, token never expires\n if (!decoded.exp) {\n return false;\n }\n\n // exp is in seconds, convert to milliseconds\n const expirationTime = decoded.exp * 1000;\n const currentTime = Date.now();\n\n // Token is expired if current time is past expiration + grace period\n return currentTime > expirationTime + gracePeriodMs;\n } catch {\n // If we can't decode the token, treat it as expired\n return true;\n }\n}\n\n/**\n * Validate a JWT token for format and expiration.\n *\n * **Security note:** This function checks JWT structure and expiration\n * but does NOT verify the signature. It is a UX-level check only.\n * For signature verification, use {@link verifyToken} with a JWKS URL.\n *\n * @param token - The JWT token string\n * @param gracePeriodMs - Grace period for expiration check (default: 30 seconds)\n * @returns Validation result with status and decoded payload if valid\n */\nexport function validateToken(\n token: string,\n gracePeriodMs: number = AUTH_CONSTANTS.TOKEN_GRACE_PERIOD_MS,\n): TokenValidationResult {\n // Check if token is provided\n if (!token || token.trim() === \"\") {\n return {\n isValid: false,\n error: \"Token is empty or not provided\",\n };\n }\n\n // Try to decode the token\n const payload = decodeToken(token);\n if (!payload) {\n return {\n isValid: false,\n error: \"Token has invalid format\",\n };\n }\n\n // Check expiration\n if (isTokenExpired(token, gracePeriodMs)) {\n return {\n isValid: false,\n payload,\n error: \"Token has expired\",\n };\n }\n\n return {\n isValid: true,\n payload,\n };\n}\n\n/**\n * Type guard to check if a validation result is valid.\n * Enables TypeScript narrowing of the result type.\n *\n * @param result - The validation result to check\n * @returns true if the token is valid (narrows payload to non-optional)\n */\nexport function isValidToken(\n result: TokenValidationResult,\n): result is TokenValidationResult & { isValid: true; payload: JWTPayload } {\n return result.isValid === true;\n}\n\n/**\n * Get the expiration time of a token as a Date.\n *\n * @param token - The JWT token string\n * @returns The expiration Date, or null if token has no expiration or is invalid\n */\nexport function getTokenExpiration(token: string): Date | null {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return null;\n }\n return new Date(decoded.exp * 1000);\n } catch {\n return null;\n }\n}\n\n/**\n * Get the time remaining until token expiration in milliseconds.\n *\n * @param token - The JWT token string\n * @returns Milliseconds until expiration, or 0 if expired/invalid, or Infinity if no expiration\n */\nexport function getTokenTimeRemaining(token: string): number {\n try {\n const decoded = decodeJwt(token);\n if (!decoded.exp) {\n return Infinity;\n }\n const expirationTime = decoded.exp * 1000;\n const remaining = expirationTime - Date.now();\n return Math.max(0, remaining);\n } catch {\n return 0;\n }\n}\n\n/**\n * Verify a JWT token's signature using a JWKS endpoint and extract its payload.\n *\n * Unlike {@link decodeToken}, this function cryptographically verifies\n * that the token was signed by a trusted key.\n *\n * @param token - The JWT token string\n * @param jwksUrl - URL of the JWKS endpoint\n * @returns The verified JWT payload, or null if verification fails\n */\nexport async function verifyToken(\n token: string,\n jwksUrl: string,\n): Promise<JWTPayload | null> {\n try {\n const JWKS = createRemoteJWKSet(new URL(jwksUrl));\n const { payload } = await jwtVerify(token, JWKS);\n\n // Type assertion required: jose's jwtVerify returns JoseJWTPayload with unknown custom claims.\n // We extend it with Partial<JWTPayload> to access our app-specific fields safely.\n const decoded = payload as JoseJWTPayload & Partial<JWTPayload>;\n return extractPayloadFromJose(decoded);\n } catch (error) {\n console.error(\"[FluidAuth] JWT signature verification failed:\", error);\n return null;\n }\n}\n","/**\n * Token Storage Utilities\n *\n * Functions for storing and retrieving auth tokens from\n * cookies and localStorage.\n */\n\nimport { AUTH_CONSTANTS, STORAGE_KEYS } from \"./constants\";\nimport type { FluidAuthConfig } from \"./types\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Parse cookies from document.cookie string into an object.\n */\nfunction parseCookies(): Record<string, string> {\n if (!isBrowser()) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const cookieString = document.cookie;\n\n if (!cookieString) {\n return cookies;\n }\n\n cookieString.split(\";\").forEach((cookie) => {\n const [name, ...valueParts] = cookie.trim().split(\"=\");\n if (name) {\n cookies[name] = decodeURIComponent(valueParts.join(\"=\"));\n }\n });\n\n return cookies;\n}\n\n/**\n * Set a cookie with the given options.\n */\nfunction setCookie(\n name: string,\n value: string,\n options: Readonly<{\n maxAge?: number;\n path?: string;\n sameSite?: \"strict\" | \"lax\" | \"none\";\n secure?: boolean;\n }> = {},\n): void {\n if (!isBrowser()) {\n return;\n }\n\n const {\n maxAge = AUTH_CONSTANTS.COOKIE_MAX_AGE,\n path = \"/\",\n sameSite = \"lax\",\n secure = window.location.protocol === \"https:\",\n } = options;\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n cookieString += `; path=${path}`;\n cookieString += `; max-age=${maxAge}`;\n cookieString += `; samesite=${sameSite}`;\n\n if (secure) {\n cookieString += \"; secure\";\n }\n\n document.cookie = cookieString;\n}\n\n/**\n * Delete a cookie by setting its max-age to 0.\n */\nfunction deleteCookie(name: string, path: string = \"/\"): void {\n if (!isBrowser()) {\n return;\n }\n\n document.cookie = `${name}=; path=${path}; max-age=0`;\n}\n\n/**\n * Get the stored auth token.\n * Checks cookie first, then falls back to localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n * @returns The stored token or null if not found\n */\nexport function getStoredToken(config?: FluidAuthConfig): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const localStorageKey = STORAGE_KEYS.USER_TOKEN;\n\n // Priority: cookie > localStorage\n const cookies = parseCookies();\n const cookieToken = cookies[cookieKey];\n\n if (cookieToken) {\n return cookieToken;\n }\n\n try {\n return localStorage.getItem(localStorageKey);\n } catch {\n // localStorage might be unavailable (private browsing, etc.)\n return null;\n }\n}\n\n/**\n * Store an auth token in both cookie and localStorage.\n * Using both provides redundancy and compatibility with different auth flows.\n *\n * @param token - The JWT token to store\n * @param config - Optional auth config for custom storage options\n */\nexport function storeToken(token: string, config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n const maxAge = config?.cookieMaxAge ?? AUTH_CONSTANTS.COOKIE_MAX_AGE;\n\n // Store in cookie\n try {\n const inIframe = window.self !== window.top;\n const sameSite = inIframe ? \"none\" : \"lax\";\n setCookie(cookieKey, token, {\n maxAge,\n path: \"/\",\n sameSite,\n // SameSite=None requires Secure per RFC 6265bis; browsers silently\n // reject the cookie otherwise (e.g. HTTP localhost in an iframe).\n secure: sameSite === \"none\" || window.location.protocol === \"https:\",\n });\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in cookie:\", error);\n }\n\n // Also store in localStorage as backup\n try {\n localStorage.setItem(STORAGE_KEYS.USER_TOKEN, token);\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to store token in localStorage:\", error);\n }\n}\n\n/**\n * Clear all stored auth tokens from cookies and localStorage.\n *\n * @param config - Optional auth config for custom cookie key\n */\nexport function clearTokens(config?: FluidAuthConfig): void {\n if (!isBrowser()) {\n return;\n }\n\n const cookieKey = config?.cookieKey ?? STORAGE_KEYS.AUTH_COOKIE;\n\n // Clear cookie\n try {\n deleteCookie(cookieKey);\n } catch {\n // Ignore cleanup errors\n }\n\n // Clear localStorage\n try {\n localStorage.removeItem(STORAGE_KEYS.USER_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.COMPANY_TOKEN);\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if any auth token is stored.\n *\n * @param config - Optional auth config\n * @returns true if a token is stored, false otherwise\n */\nexport function hasStoredToken(config?: FluidAuthConfig): boolean {\n return getStoredToken(config) !== null;\n}\n\n/**\n * Clear all stored auth tokens and redirect the user.\n * Combines clearTokens() + window redirect in a single call.\n *\n * @param redirectUrl - URL to redirect to after clearing tokens (default: \"/\")\n * @param config - Optional auth config for custom cookie key\n */\nexport function handleAuthError(\n redirectUrl: string = \"/\",\n config?: FluidAuthConfig,\n): void {\n clearTokens(config);\n if (isBrowser()) {\n window.location.href = redirectUrl;\n }\n}\n","/**\n * URL Token Utilities\n *\n * Functions for extracting and cleaning auth tokens from URL parameters.\n * This is the primary way tokens are passed from the parent Fluid Commerce\n * app to embedded portals.\n *\n * **Security model**: Tokens in URL parameters are a known tradeoff.\n * The token is extracted and immediately cleaned from the URL via\n * `history.replaceState()`. A `Referrer-Policy` meta tag in the\n * starter template prevents the token from leaking in referrer headers.\n */\n\nimport { URL_PARAMS } from \"./constants\";\nimport { isBrowser } from \"./browser-utils\";\n\n/**\n * Extract the auth token from the URL query parameters.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns The token value or null if not present\n */\nexport function extractTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Extract the company token from the URL query parameters.\n * This is a legacy parameter that may still be used in some flows.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidCompanyToken\")\n * @returns The token value or null if not present\n */\nexport function extractCompanyTokenFromUrl(\n tokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): string | null {\n if (!isBrowser()) {\n return null;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(tokenKey);\n } catch {\n return null;\n }\n}\n\n/**\n * Remove the auth token from the URL without reloading the page.\n * This prevents the token from being accidentally shared via URL copy/paste\n * or appearing in browser history.\n *\n * Uses history.replaceState to update the URL cleanly.\n *\n * @param tokenKey - The URL parameter name to remove (default: \"fluidUserToken\")\n */\nexport function cleanTokenFromUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const url = new URL(window.location.href);\n const hadToken = url.searchParams.has(tokenKey);\n const hadCompanyToken = url.searchParams.has(URL_PARAMS.COMPANY_TOKEN);\n\n // Remove both user and company tokens\n url.searchParams.delete(tokenKey);\n url.searchParams.delete(URL_PARAMS.COMPANY_TOKEN);\n\n // Only update URL if we actually removed something\n if (hadToken || hadCompanyToken) {\n // Use replaceState to avoid adding to browser history\n window.history.replaceState(\n window.history.state,\n document.title,\n url.toString(),\n );\n }\n } catch (error) {\n console.warn(\"[FluidAuth] Failed to clean token from URL:\", error);\n }\n}\n\n/**\n * Check if the URL contains an auth token parameter.\n *\n * @param tokenKey - The URL parameter name (default: \"fluidUserToken\")\n * @returns true if the URL contains the token parameter\n */\nexport function hasTokenInUrl(\n tokenKey: string = URL_PARAMS.USER_TOKEN,\n): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.has(tokenKey);\n } catch {\n return false;\n }\n}\n\n/**\n * Extract all auth-related tokens from the URL at once.\n *\n * @param userTokenKey - The URL parameter name for user token\n * @param companyTokenKey - The URL parameter name for company token\n * @returns Object with both token values (or null if not present)\n */\nexport function extractAllTokensFromUrl(\n userTokenKey: string = URL_PARAMS.USER_TOKEN,\n companyTokenKey: string = URL_PARAMS.COMPANY_TOKEN,\n): { userToken: string | null; companyToken: string | null } {\n if (!isBrowser()) {\n return { userToken: null, companyToken: null };\n }\n\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return {\n userToken: searchParams.get(userTokenKey),\n companyToken: searchParams.get(companyTokenKey),\n };\n } catch {\n return { userToken: null, companyToken: null };\n }\n}\n","import type { JWTPayload } from \"./types\";\nimport { USER_TYPES } from \"./types\";\n\n/**\n * Check if dev bypass should be active.\n * Requires both the config flag AND Vite dev mode.\n */\nexport function isDevBypassActive(devBypass?: boolean): boolean {\n if (!devBypass) return false;\n\n try {\n // import.meta.env.DEV is a Vite compile-time constant.\n // It's `true` in dev mode and completely tree-shaken in production.\n // The type assertion avoids requiring Vite ambient types in all consumers.\n const meta = import.meta as { env?: { DEV?: boolean } };\n return meta.env?.DEV === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a synthetic dev user for local development.\n * This user has realistic data for UI rendering but no real auth.\n */\nexport function createDevUser(): JWTPayload {\n return {\n id: 99999, // Dev placeholder — avoids falsy 0\n email: \"dev@localhost\",\n full_name: \"Dev User\",\n user_type: USER_TYPES.rep,\n og_user_type: undefined,\n company_id: 99999, // Dev placeholder — avoids falsy 0\n exp: undefined, // Never expires\n auth_type: \"dev_bypass\",\n };\n}\n","import { z } from \"zod\";\nimport type { FetchClientInstance } from \"@fluid-app/api-client-core\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface Company {\n id: number;\n name: string;\n logo_url?: string | null;\n icon_url?: string | null;\n}\n\nexport interface SwitchCompanyResponseCompany {\n id: number;\n name: string;\n fluid_shop: string;\n logo_url?: string | null;\n jwt: string;\n}\n\nexport interface SwitchCompanyResponseMeta {\n request_id: string;\n timestamp: string;\n}\n\nexport interface SwitchCompanyResponse {\n company: SwitchCompanyResponseCompany;\n meta: SwitchCompanyResponseMeta;\n}\n\n// ============================================================================\n// Schemas\n// ============================================================================\n\nexport const companySchema: z.ZodType<Company> = z.object({\n id: z.number(),\n name: z.string(),\n logo_url: z.string().optional().nullable(),\n icon_url: z.string().nullable().optional(),\n});\n\nexport const switchCompanyResponseCompanySchema: z.ZodType<SwitchCompanyResponseCompany> =\n z.object({\n id: z.number().int().positive(),\n name: z.string(),\n fluid_shop: z.string(),\n logo_url: z.string().url().nullable().optional(),\n jwt: z.string(),\n });\n\nexport const switchCompanyResponseMetaSchema: z.ZodType<SwitchCompanyResponseMeta> =\n z.object({\n request_id: z.string(),\n timestamp: z.string(),\n });\n\nexport const switchCompanyResponseSchema: z.ZodType<SwitchCompanyResponse> =\n z.object({\n company: switchCompanyResponseCompanySchema,\n meta: switchCompanyResponseMetaSchema,\n });\n\n// ============================================================================\n// API function\n// ============================================================================\n\nexport function switchCompany(\n client: FetchClientInstance,\n companyId: number,\n): Promise<SwitchCompanyResponse> {\n return client\n .put<unknown>(`/authentication/company/${companyId}/switch`)\n .then((data) => switchCompanyResponseSchema.parse(data));\n}\n","/**\n * Auth Redirect Utilities\n *\n * Provides default redirect behavior for authentication failures.\n * When no custom callback is provided, the SDK redirects to Fluid's\n * auth page with a redirect_url pointing back to the current page.\n *\n * Includes loop detection: if a redirect was attempted within the\n * cooldown window, subsequent calls are suppressed to prevent\n * infinite redirect cycles (e.g., auth returns a token the API rejects).\n */\n\n/**\n * Default Fluid authentication URL.\n * Users are redirected here when auth fails and no custom handler is provided.\n */\nexport const DEFAULT_AUTH_URL = \"https://auth.fluid.app\";\n\n/**\n * URL parameter name used by auth.fluid.app when redirecting back with a token.\n * This differs from the SDK's default `fluidUserToken` (used by the parent Fluid app\n * when embedding portals in iframes). The auth provider checks both.\n */\nexport const AUTH_REDIRECT_TOKEN_KEY = \"jwt\";\n\n/** sessionStorage key for loop detection */\nconst REDIRECT_TIMESTAMP_KEY = \"__fluid_auth_redirect_ts\";\n\n/** Minimum seconds between redirect attempts */\nconst REDIRECT_COOLDOWN_S = 10;\n\n/**\n * Check if a redirect was recently attempted.\n * Returns true if we should suppress the redirect to avoid a loop.\n */\nfunction isRedirectLoop(): boolean {\n try {\n const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);\n if (!ts) return false;\n const elapsed = (Date.now() - Number(ts)) / 1000;\n return elapsed < REDIRECT_COOLDOWN_S;\n } catch {\n // sessionStorage unavailable (SSR, privacy mode) — allow redirect\n return false;\n }\n}\n\n/**\n * Record that a redirect is about to happen.\n */\nfunction markRedirect(): void {\n try {\n sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));\n } catch {\n // sessionStorage unavailable — best-effort\n }\n}\n\n/**\n * Creates a redirect function that navigates to the auth URL\n * with the current page URL encoded as a redirect parameter.\n *\n * Includes loop detection: if a redirect was attempted within the last\n * {@link REDIRECT_COOLDOWN_S} seconds, the redirect is suppressed and\n * the normal error UI is allowed to render instead.\n *\n * @param authUrl - Custom auth URL to redirect to. Defaults to DEFAULT_AUTH_URL.\n * @returns A function that performs the redirect when called (no-op if loop detected).\n */\nexport function createDefaultAuthRedirect(authUrl?: string): () => void {\n return () => {\n if (isRedirectLoop()) {\n console.warn(\n \"[FluidAuth] Auth redirect suppressed — possible redirect loop. \" +\n \"Check that your auth server returns a token accepted by the API.\",\n );\n return;\n }\n markRedirect();\n const base = authUrl ?? DEFAULT_AUTH_URL;\n const currentUrl = encodeURIComponent(window.location.href);\n window.location.href = `${base}/?redirect_url=${currentUrl}`;\n };\n}\n\n/**\n * Resolves the effective auth failure handler.\n * Returns the custom callback if provided, otherwise creates a default redirect.\n *\n * @param onAuthFailure - Custom callback from user config\n * @param authUrl - Custom auth URL (only used when creating the default redirect)\n * @returns The resolved handler function\n */\nexport function resolveAuthFailureHandler(\n onAuthFailure?: (() => void) | undefined,\n authUrl?: string | undefined,\n): () => void {\n return onAuthFailure ?? createDefaultAuthRedirect(authUrl);\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/portal-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/portal-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/portal-core/types\";\nimport type { components } from \"@fluid-app/fluidos-api-client\";\n\n/** Raw navigation item from the FluidOS API (derived from generated types) */\nexport type RawApiNavigationItem =\n components[\"schemas\"][\"FluidOSNavigationItem\"];\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/portal-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/portal-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/** Raw manifest shape from the `/fluid_os/definitions/active` API response */\nexport interface RawManifestResponse {\n manifest: {\n definition_id: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id: number;\n themes?: RawApiTheme[];\n navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * This is the top-level transform used by `FluidClient.app.get()`.\n * It handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n\n return {\n definition_id: manifest.definition_id,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? manifest.definition_id,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? manifest.definition_id,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? manifest.definition_id,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","/**\n * Fluid API Client\n * Adapted from: packages/fluidos-api-client/src/lib/fetch-client.ts\n * Provides authenticated API access with domain-specific methods\n */\n\nimport type { SwitchCompanyResponse } from \"@fluid-app/auth\";\nimport type { Rep, UpdateRepData, UserMe } from \"../types/rep\";\nimport type { Profile } from \"../types/profile\";\nimport type { UserPermissions } from \"../types/permissions\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\nimport {\n createFetchClient,\n fluidOs,\n type FetchClient,\n} from \"@fluid-app/fluidos-api-client\";\nimport {\n HTTP_METHODS,\n type FluidSDKConfig,\n type RequestOptions,\n type BaseListParams,\n} from \"./types\";\nimport { createDefaultAuthRedirect } from \"../auth/auth-redirect\";\nimport {\n transformManifestToRepAppData,\n type RawManifestResponse,\n} from \"../transforms\";\n\n/**\n * API Error class for structured error handling\n */\nexport class ApiError extends Error {\n readonly status: number;\n readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n // V8-specific stack trace capture (Node.js, Chrome)\n const errorWithCapture = Error as typeof Error & {\n captureStackTrace?: (\n target: object,\n constructor: typeof ApiError,\n ) => void;\n };\n if (errorWithCapture.captureStackTrace) {\n errorWithCapture.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON(): { name: string; message: string; status: number; data: unknown } {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n// ============================================================================\n// Discriminated Union for API Responses\n// ============================================================================\n\n/**\n * Discriminated union representing the result of an API call.\n * Use `isApiSuccess` and `isApiFailure` type guards to narrow.\n */\nexport type ApiResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: ApiError };\n\n/**\n * Type guard for successful API result\n */\nexport function isApiSuccess<T>(\n result: ApiResult<T>,\n): result is { readonly success: true; readonly data: T } {\n return result.success === true;\n}\n\n/**\n * Type guard for failed API result\n */\nexport function isApiFailure<T>(\n result: ApiResult<T>,\n): result is { readonly success: false; readonly error: ApiError } {\n return result.success === false;\n}\n\n/**\n * Type guard to check if a value is a non-null string\n */\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Extract error message from API response data using `in` operator narrowing.\n * Checks common error message field names in order of precedence.\n */\nfunction extractErrorMessage(\n data: Readonly<Record<string, unknown>>,\n fallback: string,\n): string {\n // Use `in` operator to narrow and then type guard to validate string type\n if (\"message\" in data && isString(data.message)) {\n return data.message;\n }\n if (\"error_message\" in data && isString(data.error_message)) {\n return data.error_message;\n }\n if (\"error\" in data && isString(data.error)) {\n return data.error;\n }\n return fallback;\n}\n\n// ============================================================================\n// Domain Types\n// ============================================================================\n\n// ============================================================================\n// Product Types\n// ============================================================================\n\nexport interface Product {\n readonly id: number;\n readonly title: string;\n readonly sku?: string | null;\n readonly price: string | number;\n readonly description?: string | null;\n readonly image_url?: string;\n readonly status?: string;\n readonly active?: boolean;\n readonly slug?: string;\n readonly in_stock?: boolean;\n readonly display_price?: string;\n readonly currency_code?: string;\n readonly updated_at?: string;\n}\n\nexport interface ProductListParams extends BaseListParams {\n readonly search_query?: string;\n readonly status?: readonly (\"active\" | \"draft\" | \"archived\" | \"all\")[];\n readonly category_id?: string;\n readonly category_ids?: readonly number[];\n readonly collection_id?: string;\n readonly collection_ids?: readonly number[];\n readonly order_by?: readonly string[];\n readonly country_code?: readonly string[];\n readonly published_stores?: readonly (\"retail\" | \"rep\")[];\n}\n\nexport interface ProductsResponse {\n readonly products: readonly Product[];\n readonly meta: {\n readonly request_id: string;\n readonly timestamp: string;\n readonly pagination?: {\n readonly current_page: number;\n readonly per_page: number;\n readonly total_pages: number;\n readonly total_count: number;\n };\n };\n}\n\n// ============================================================================\n// Order Types\n// ============================================================================\n\nexport interface Order {\n readonly id: string;\n readonly order_number: string;\n readonly status: string;\n readonly total: number;\n readonly customer_id: string;\n readonly rep_id?: string;\n readonly created_at: string;\n readonly updated_at: string;\n}\n\nexport interface OrderListParams extends BaseListParams {\n readonly status?: string;\n readonly customer_id?: string;\n readonly date_from?: string;\n readonly date_to?: string;\n}\n\nexport interface CreateOrderData {\n readonly customer_id: string;\n readonly line_items: readonly OrderLineItem[];\n readonly notes?: string;\n}\n\nexport interface OrderLineItem {\n readonly product_id: string;\n readonly quantity: number;\n readonly price?: number;\n}\n\n// ============================================================================\n// Analytics Types\n// ============================================================================\n\nexport interface DashboardData {\n readonly total_sales: number;\n readonly total_orders: number;\n readonly total_customers: number;\n readonly recent_orders: readonly Order[];\n}\n\nexport interface SalesParams {\n readonly date_from?: string;\n readonly date_to?: string;\n readonly group_by?: \"day\" | \"week\" | \"month\";\n}\n\nexport interface SalesData {\n readonly total: number;\n readonly data: readonly SalesDataPoint[];\n}\n\nexport interface SalesDataPoint {\n readonly date: string;\n readonly amount: number;\n readonly orders: number;\n}\n\n// ============================================================================\n// Client Return Type\n// ============================================================================\n\n/**\n * The shape returned by `createFluidClient`.\n * Generic helper methods preserve their type parameters so callers\n * can specify response types at each call site.\n */\nexport interface FluidClientReturn {\n readonly fetchClient: FetchClient;\n\n readonly request: <TResponse = unknown>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse>;\n\n readonly requestNullable: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<TResponse | null>;\n\n readonly safeRequest: <TResponse>(\n endpoint: string,\n options?: RequestOptions,\n ) => Promise<ApiResult<TResponse>>;\n\n readonly get: <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => Promise<TResponse>;\n\n readonly post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) => Promise<TResponse>;\n\n readonly delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) => Promise<TResponse>;\n\n readonly products: {\n readonly list: (params?: ProductListParams) => Promise<ProductsResponse>;\n readonly get: (id: string | number) => Promise<{ product: Product }>;\n readonly search: (\n query: string,\n params?: ProductListParams,\n ) => Promise<ProductsResponse>;\n };\n\n readonly orders: {\n readonly list: (params?: OrderListParams) => Promise<Order[]>;\n readonly get: (id: string) => Promise<Order>;\n readonly create: (data: CreateOrderData) => Promise<Order>;\n };\n\n readonly users: {\n readonly me: () => Promise<UserMe>;\n readonly switchCompany: (\n companyId: number,\n ) => Promise<SwitchCompanyResponse>;\n };\n\n readonly reps: {\n readonly current: () => Promise<Rep>;\n readonly updateProfile: (data: UpdateRepData) => Promise<Rep>;\n };\n\n readonly profile: {\n readonly get: () => Promise<Profile>;\n };\n\n readonly app: {\n readonly getRaw: () => Promise<RawManifestResponse>;\n readonly get: () => Promise<RepAppData>;\n };\n\n readonly permissions: {\n readonly get: () => Promise<UserPermissions>;\n };\n\n readonly analytics: {\n readonly dashboard: () => Promise<DashboardData>;\n readonly sales: (params?: SalesParams) => Promise<SalesData>;\n };\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\n/**\n * Creates a configured Fluid API client instance\n */\nexport function createFluidClient(config: FluidSDKConfig): FluidClientReturn {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();\n\n // Create a fluidos FetchClient for structured API calls (manifest, etc.)\n // Conditional spread for exactOptionalPropertyTypes: only include getAuthToken when defined\n const fetchClient: FetchClient = createFetchClient({\n baseUrl,\n ...(getAuthToken ? { getAuthToken } : {}),\n onAuthError: effectiveOnAuthError,\n defaultHeaders,\n });\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters (Rails-compatible)\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Construct URL by concatenating baseUrl + endpoint\n // Using URL constructor with relative paths would strip the baseUrl path (e.g., /api)\n const normalizedBase = baseUrl.endsWith(\"/\")\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedEndpoint = endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`;\n const url = new URL(normalizedBase + normalizedEndpoint);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n for (const item of value) {\n url.searchParams.append(`${key}[]`, String(item));\n }\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (subValue === undefined || subValue === null) {\n continue;\n }\n\n if (Array.isArray(subValue)) {\n for (const item of subValue) {\n url.searchParams.append(`${key}[${subKey}][]`, String(item));\n }\n } else {\n url.searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Default request options for type-safe defaults.\n * Uses `satisfies` to validate against RequestOptions while preserving literal types.\n */\n const defaultRequestOptions = {\n method: HTTP_METHODS.GET,\n } as const satisfies Partial<RequestOptions>;\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = defaultRequestOptions.method,\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n // Use buildUrl for all requests to ensure baseUrl path is preserved\n const url = buildUrl(\n endpoint,\n method === HTTP_METHODS.GET ? params : undefined,\n );\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n // Only add signal and body when defined to satisfy exactOptionalPropertyTypes\n // RequestInit expects signal: AbortSignal | null, not undefined\n if (signal !== undefined) {\n fetchOptions.signal = signal;\n }\n if (body && method !== HTTP_METHODS.GET) {\n fetchOptions.body = JSON.stringify(body);\n }\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Handle authentication errors — invoke the handler, then throw so\n // TanStack Query surfaces the error instead of caching `null` as data.\n if (response.status === 401) {\n effectiveOnAuthError();\n throw new ApiError(\"Authentication required\", 401, null);\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = (await response.json()) as Record<string, unknown>;\n // Use `in` operator narrowing to safely extract error message\n const errorMessage = extractErrorMessage(\n data,\n `${method} request failed`,\n );\n throw new ApiError(\n errorMessage,\n response.status,\n \"errors\" in data ? data.errors : data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (isApiError(error)) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting nullable responses should use requestNullable<T>\n // which properly types the return as T | null\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n // Type assertion required: 204 No Content has no body to parse.\n // This is safe when TResponse is a union including null (e.g., T | null).\n // For fully type-safe nullable handling, prefer requestNullable() or safeRequest().\n return null as TResponse;\n }\n\n try {\n const data: unknown = await response.json();\n // Runtime check: verify we got an object/array, not a primitive that would be mistyped\n if (data === null || data === undefined) {\n throw new ApiError(\n \"Unexpected null/undefined in JSON response\",\n response.status,\n null,\n );\n }\n // Type assertion required: JSON.parse returns `unknown`, but we've validated\n // the response is not null/undefined. The caller specifies TResponse based on\n // their knowledge of the API endpoint's response schema.\n return data as TResponse;\n } catch (parseError) {\n if (isApiError(parseError)) {\n throw parseError;\n }\n throw new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n );\n }\n }\n\n /**\n * Request function for endpoints that may return null (204 No Content).\n * Properly types the return as T | null.\n */\n async function requestNullable<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse | null> {\n return request<TResponse | null>(endpoint, options);\n }\n\n /**\n * Safe request wrapper that returns a discriminated union instead of throwing.\n * Use `isApiSuccess` or `isApiFailure` to narrow the result.\n */\n async function safeRequest<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<ApiResult<TResponse>> {\n try {\n const data = await request<TResponse>(endpoint, options);\n return { success: true, data };\n } catch (error) {\n if (isApiError(error)) {\n return { success: false, error };\n }\n // Wrap unknown errors in ApiError\n return {\n success: false,\n error: new ApiError(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n null,\n ),\n };\n }\n }\n\n /**\n * Helper to safely convert typed params to Record<string, unknown>.\n * Type assertion required: TypeScript's structural typing allows any object\n * to be treated as Record<string, unknown> when we only need to iterate\n * over its entries. This is safe because buildUrl only reads properties.\n */\n function toParams<T extends object>(\n params: T | undefined,\n ): Record<string, unknown> | undefined {\n return params as Record<string, unknown> | undefined;\n }\n\n // Convenience HTTP methods using HTTP_METHODS constant for type safety\n const get = <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ): Promise<TResponse> => {\n // Build request options object, only adding params if defined\n const baseOptions = {\n ...options,\n method: HTTP_METHODS.GET,\n } satisfies RequestOptions;\n\n const convertedParams = toParams(params);\n const requestOptions: RequestOptions =\n convertedParams !== undefined\n ? { ...baseOptions, params: convertedParams }\n : baseOptions;\n\n return request<TResponse>(endpoint, requestOptions);\n };\n\n const post = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.POST,\n body,\n } satisfies RequestOptions);\n\n const put = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PUT,\n body,\n } satisfies RequestOptions);\n\n const patch = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PATCH,\n body,\n } satisfies RequestOptions);\n\n const del = <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ): Promise<TResponse> =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.DELETE,\n } satisfies RequestOptions);\n\n // ============================================================================\n // Domain-Specific API Methods\n // ============================================================================\n\n return {\n // Fluidos FetchClient for structured API calls\n fetchClient: fetchClient,\n\n // Low-level methods for custom endpoints\n request: request,\n requestNullable: requestNullable,\n safeRequest: safeRequest,\n get: get,\n post: post,\n put: put,\n patch: patch,\n delete: del,\n\n // Products API - matches fluid-admin's /company/v1/products\n products: {\n list: (params?: ProductListParams): Promise<ProductsResponse> =>\n get<ProductsResponse, ProductListParams>(\n \"/api/company/v1/products\",\n params,\n ),\n get: (id: string | number): Promise<{ product: Product }> =>\n get<{ product: Product }>(`/api/company/v1/products/${id}`),\n search: (\n query: string,\n params?: ProductListParams,\n ): Promise<ProductsResponse> =>\n get<ProductsResponse>(\"/api/company/v1/products\", {\n search_query: query,\n ...params,\n } as Record<string, unknown>),\n },\n\n // Orders API\n orders: {\n list: (params?: OrderListParams): Promise<Order[]> =>\n get<Order[], OrderListParams>(\"/api/orders\", params),\n get: (id: string): Promise<Order> => get<Order>(`/api/orders/${id}`),\n create: (data: CreateOrderData): Promise<Order> =>\n post<Order>(\"/api/orders\", data),\n },\n\n // Users API\n users: {\n me: (): Promise<UserMe> => get<UserMe>(\"/api/me\"),\n switchCompany: (companyId: number): Promise<SwitchCompanyResponse> =>\n put<SwitchCompanyResponse>(\n `/api/authentication/company/${companyId}/switch`,\n ),\n },\n\n // Reps API\n reps: {\n current: (): Promise<Rep> => get<Rep>(\"/api/reps/me\"),\n updateProfile: (data: UpdateRepData): Promise<Rep> =>\n patch<Rep>(\"/api/reps/me\", data),\n },\n\n /**\n * Profile API (themes, navigation, screens).\n * @deprecated Use `app.get()` instead — returns full `RepAppData` including `profile`.\n */\n profile: {\n /** @deprecated Use `app.get()` instead. */\n get: async (): Promise<Profile> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n const appData = transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n return appData.profile;\n },\n },\n\n // App API — fluidos endpoint (full manifest with transforms)\n app: {\n /** Fetch the raw manifest (plain JSON, no Color objects). Cache-safe. */\n getRaw: async (): Promise<RawManifestResponse> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n // The fluidos-api-client returns { manifest?, meta? } — cast to\n // RawManifestResponse shape which transformManifestToRepAppData expects\n return raw as unknown as RawManifestResponse;\n },\n /** Fetch the active app definition with full theme/screen/navigation transforms */\n get: async (): Promise<RepAppData> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n return transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n },\n },\n\n // Permissions API\n permissions: {\n get: (): Promise<UserPermissions> =>\n get<UserPermissions>(\"/api/company/roles/my_permissions\"),\n },\n\n // Analytics API\n analytics: {\n dashboard: (): Promise<DashboardData> =>\n get<DashboardData>(\"/api/analytics/dashboard\"),\n sales: (params?: SalesParams): Promise<SalesData> =>\n get<SalesData, SalesParams>(\"/api/analytics/sales\", params),\n },\n };\n}\n\nexport type FluidClient = ReturnType<typeof createFluidClient>;\n","export * from \"@fluid-app/portal-core/theme\";\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using portal-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeTheme,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared portal-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from portal-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps): React.JSX.Element {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n if (currentTheme) {\n removeTheme(currentTheme.id);\n }\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","/**\n * FluidAuthProvider - Authentication Provider for Fluid Portal SDK\n *\n * Handles JWT token extraction from URL, validation, storage, and\n * provides authentication context to child components.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useReducer,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport type {\n FluidAuthConfig,\n FluidAuthContextValue,\n JWTPayload,\n} from \"../auth/types\";\nimport { extractTokenFromUrl, cleanTokenFromUrl } from \"../auth/url-token\";\nimport { getStoredToken, storeToken, clearTokens } from \"../auth/token-storage\";\nimport {\n validateToken,\n verifyToken,\n isTokenExpired,\n} from \"../auth/token-utils\";\nimport { isDevBypassActive, createDevUser } from \"../auth/dev-utils\";\nimport {\n resolveAuthFailureHandler,\n AUTH_REDIRECT_TOKEN_KEY,\n} from \"../auth/auth-redirect\";\n\n/**\n * Auth context - null when outside provider\n */\nconst FluidAuthContext = createContext<FluidAuthContextValue | null>(null);\n\ninterface AuthState {\n isLoading: boolean;\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n}\n\ntype AuthAction =\n | {\n type: \"SET_AUTH\";\n token: string | null;\n user: JWTPayload | null;\n error: Error | null;\n }\n | { type: \"CLEAR_AUTH\" }\n | { type: \"DONE_LOADING\" };\n\nfunction authReducer(state: AuthState, action: AuthAction): AuthState {\n switch (action.type) {\n case \"SET_AUTH\":\n return {\n isLoading: false,\n token: action.token,\n user: action.user,\n error: action.error,\n };\n case \"CLEAR_AUTH\":\n return { ...state, token: null, user: null, error: null };\n case \"DONE_LOADING\":\n return { ...state, isLoading: false };\n }\n}\n\nconst initialAuthState: AuthState = {\n isLoading: true,\n token: null,\n user: null,\n error: null,\n};\n\nexport interface FluidAuthProviderProps {\n /** React children to wrap with auth context */\n children: ReactNode;\n /** Auth configuration options */\n config?: FluidAuthConfig;\n}\n\n/**\n * Authentication provider for Fluid portal applications.\n *\n * On mount, this provider:\n * 1. Checks for a token in the URL (passed from parent app)\n * 2. Cleans token from URL immediately (security)\n * 3. Falls back to stored token (cookie/localStorage)\n * 4. Validates the token (checks expiration)\n * 5. Stores valid tokens for future use\n * 6. Calls onAuthFailure if no valid token found\n *\n * @example\n * ```tsx\n * import { FluidAuthProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidAuthProvider\n * config={{\n * onAuthFailure: () => {\n * window.location.href = \"/login\";\n * },\n * }}\n * >\n * <YourApp />\n * </FluidAuthProvider>\n * );\n * }\n * ```\n */\nexport function FluidAuthProvider({\n children,\n config,\n}: FluidAuthProviderProps): React.JSX.Element {\n const configRef = useRef(config);\n configRef.current = config;\n\n const [state, dispatch] = useReducer(authReducer, initialAuthState);\n const { isLoading, token, user, error } = state;\n\n // Initialize auth on mount\n useEffect(() => {\n const initializeAuth = async () => {\n const handleAuthFailure = () => {\n const current = configRef.current;\n const handler = resolveAuthFailureHandler(\n current?.onAuthFailure,\n current?.authUrl,\n );\n handler();\n };\n\n try {\n // DEV BYPASS: Check for env variable token first, then dev bypass\n if (isDevBypassActive(config?.devBypass)) {\n // Check for VITE_DEV_TOKEN env variable first (real token in dev)\n const envToken = import.meta.env.VITE_DEV_TOKEN;\n if (envToken) {\n const validation = validateToken(envToken, config?.gracePeriodMs);\n if (validation.isValid && validation.payload) {\n storeToken(envToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: envToken,\n user: validation.payload,\n error: null,\n });\n return;\n }\n console.warn(\n \"[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user\",\n );\n }\n\n // No valid env token - use synthetic dev user\n console.warn(\n \"[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token.\",\n );\n const devUser = createDevUser();\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: devUser,\n error: null,\n });\n return;\n }\n\n // 1. Try to get token from URL first (fresh authentication)\n const tokenKey = config?.tokenKey ?? \"fluidUserToken\";\n let candidateToken = extractTokenFromUrl(tokenKey);\n\n // Fallback: auth.fluid.app returns the token as \"jwt\", not \"fluidUserToken\"\n if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {\n candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n }\n\n // Clean token from URL immediately after extraction (security)\n // Do this BEFORE validation so the URL is clean even if validation fails\n cleanTokenFromUrl(tokenKey);\n cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n\n // 2. Fall back to stored token\n if (!candidateToken) {\n candidateToken = getStoredToken(config);\n }\n\n // 3. If we have a token, validate it\n if (candidateToken) {\n let payload: JWTPayload | null = null;\n\n if (config?.jwksUrl) {\n // Signature verification enabled - use verifyToken\n payload = await verifyToken(candidateToken, config.jwksUrl);\n if (!payload) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"JWT signature verification failed\"),\n });\n handleAuthFailure();\n return;\n }\n // Also check expiration\n if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"Token has expired\"),\n });\n handleAuthFailure();\n return;\n }\n } else {\n // No JWKS - existing behavior (decode only, check expiration)\n const validation = validateToken(\n candidateToken,\n config?.gracePeriodMs,\n );\n if (validation.isValid && validation.payload) {\n payload = validation.payload;\n } else {\n clearTokens(config);\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(validation.error ?? \"Invalid token\"),\n });\n handleAuthFailure();\n return;\n }\n }\n\n // Valid token - store it and update state\n storeToken(candidateToken, config);\n dispatch({\n type: \"SET_AUTH\",\n token: candidateToken,\n user: payload,\n error: null,\n });\n } else {\n // No token available\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: new Error(\"No authentication token found\"),\n });\n handleAuthFailure();\n }\n } catch (err) {\n const authError =\n err instanceof Error ? err : new Error(\"Authentication error\");\n dispatch({\n type: \"SET_AUTH\",\n token: null,\n user: null,\n error: authError,\n });\n handleAuthFailure();\n } finally {\n dispatch({ type: \"DONE_LOADING\" });\n }\n };\n\n void initializeAuth();\n // Only run on mount - config changes don't re-initialize\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear auth handler\n const clearAuth = useCallback(() => {\n clearTokens(configRef.current);\n dispatch({ type: \"CLEAR_AUTH\" });\n }, []);\n\n // Memoize context value\n // Use `satisfies` to validate shape at compile time while preserving inference\n const contextValue = useMemo(\n () =>\n ({\n isAuthenticated: user !== null,\n isLoading,\n user,\n token,\n clearAuth,\n error,\n }) satisfies FluidAuthContextValue,\n [token, isLoading, user, clearAuth, error],\n );\n\n return (\n <FluidAuthContext.Provider value={contextValue}>\n {children}\n </FluidAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access the auth context directly.\n * Prefer using `useFluidAuth` for most use cases.\n *\n * @throws Error if used outside FluidAuthProvider\n */\nexport function useFluidAuthContext(): FluidAuthContextValue {\n const context = useContext(FluidAuthContext);\n\n if (!context) {\n throw new Error(\n \"useFluidAuthContext must be used within a FluidAuthProvider. \" +\n \"Wrap your app with <FluidAuthProvider> to use authentication features.\",\n );\n }\n\n return context;\n}\n\n/** Safe accessor — returns null when outside FluidAuthProvider (no throw) */\nexport function useFluidAuthOptional(): FluidAuthContextValue | null {\n return useContext(FluidAuthContext);\n}\n","import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\n\n// Widget Components\nexport { AlertWidget, alertWidgetPropertySchema } from \"./AlertWidget\";\nexport {\n BulletListWidget,\n bulletListWidgetPropertySchema,\n} from \"./BulletListWidget\";\nexport { CalendarWidget, calendarWidgetPropertySchema } from \"./CalendarWidget\";\nexport { CardWidget, cardWidgetPropertySchema } from \"./CardWidget\";\nexport { CarouselWidget, carouselWidgetPropertySchema } from \"./CarouselWidget\";\nexport { CatchUpWidget, catchUpWidgetPropertySchema } from \"./CatchUpWidget\";\nexport { ChartWidget, chartWidgetPropertySchema } from \"./ChartWidget\";\nexport {\n ContainerWidget,\n containerWidgetPropertySchema,\n} from \"./ContainerWidget\";\nexport { EmbedWidget, embedWidgetPropertySchema } from \"./EmbedWidget\";\nexport { ImageWidget, imageWidgetPropertySchema } from \"./ImageWidget\";\nexport { LayoutWidget, layoutWidgetPropertySchema } from \"./LayoutWidget\";\nexport { LinkWidget, linkWidgetPropertySchema } from \"./LinkWidget\";\nexport { ListWidget, listWidgetPropertySchema } from \"./ListWidget\";\nexport { MySiteWidget, mySiteWidgetPropertySchema } from \"./MySiteWidget\";\nexport { NestedWidget, nestedWidgetPropertySchema } from \"./NestedWidget\";\nexport { PointsWidget, pointsWidgetPropertySchema } from \"./PointsWidget\";\nexport {\n QuickShareWidget,\n quickShareWidgetPropertySchema,\n} from \"./QuickShareWidget\";\nexport {\n RecentActivityWidget,\n recentActivityWidgetPropertySchema,\n} from \"./RecentActivityWidget\";\nexport {\n SeparatorWidget,\n separatorWidgetPropertySchema,\n} from \"./SeparatorWidget\";\nexport { SpacerWidget, spacerWidgetPropertySchema } from \"./SpacerWidget\";\nexport { TableWidget, tableWidgetPropertySchema } from \"./TableWidget\";\nexport { TextWidget, textWidgetPropertySchema } from \"./TextWidget\";\nexport { ToDoWidget, toDoWidgetPropertySchema } from \"./ToDoWidget\";\nexport { VideoWidget, videoWidgetPropertySchema } from \"./VideoWidget\";\n\n// Re-export gapValues from core (used by widgets)\nexport { gapValues } from \"../core/fields\";\n\n// Re-export all property schemas as a collection\nexport const widgetPropertySchemas = {\n AlertWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./AlertWidget\").then((m) => m.alertWidgetPropertySchema),\n BulletListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./BulletListWidget\").then((m) => m.bulletListWidgetPropertySchema),\n CalendarWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CalendarWidget\").then((m) => m.calendarWidgetPropertySchema),\n CardWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CardWidget\").then((m) => m.cardWidgetPropertySchema),\n CarouselWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CarouselWidget\").then((m) => m.carouselWidgetPropertySchema),\n CatchUpWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./CatchUpWidget\").then((m) => m.catchUpWidgetPropertySchema),\n ChartWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ChartWidget\").then((m) => m.chartWidgetPropertySchema),\n ContainerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ContainerWidget\").then((m) => m.containerWidgetPropertySchema),\n EmbedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./EmbedWidget\").then((m) => m.embedWidgetPropertySchema),\n ImageWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ImageWidget\").then((m) => m.imageWidgetPropertySchema),\n LayoutWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LayoutWidget\").then((m) => m.layoutWidgetPropertySchema),\n LinkWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./LinkWidget\").then((m) => m.linkWidgetPropertySchema),\n ListWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ListWidget\").then((m) => m.listWidgetPropertySchema),\n MySiteWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./MySiteWidget\").then((m) => m.mySiteWidgetPropertySchema),\n NestedWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./NestedWidget\").then((m) => m.nestedWidgetPropertySchema),\n PointsWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./PointsWidget\").then((m) => m.pointsWidgetPropertySchema),\n QuickShareWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./QuickShareWidget\").then((m) => m.quickShareWidgetPropertySchema),\n RecentActivityWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./RecentActivityWidget\").then(\n (m) => m.recentActivityWidgetPropertySchema,\n ),\n SeparatorWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SeparatorWidget\").then((m) => m.separatorWidgetPropertySchema),\n SpacerWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./SpacerWidget\").then((m) => m.spacerWidgetPropertySchema),\n TableWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TableWidget\").then((m) => m.tableWidgetPropertySchema),\n TextWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./TextWidget\").then((m) => m.textWidgetPropertySchema),\n ToDoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./ToDoWidget\").then((m) => m.toDoWidgetPropertySchema),\n VideoWidget: (): Promise<WidgetPropertySchema> =>\n import(\"./VideoWidget\").then((m) => m.videoWidgetPropertySchema),\n};\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from portal-widgets.\n */\n\nimport type { WidgetRegistry } from \"@fluid-app/portal-core/types\";\nimport { createWidgetRegistry } from \"@fluid-app/portal-core/widget-utils\";\nimport {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/portal-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY: WidgetRegistry = createWidgetRegistry(\n {\n AlertWidget,\n BulletListWidget,\n CalendarWidget,\n CardWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n LinkWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n PointsWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SeparatorWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n },\n);\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n QueryClient,\n QueryClientProvider,\n useQuery,\n} from \"@tanstack/react-query\";\nimport {\n customersApi,\n createFetchClient as createFluidPayFetchClient,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { createFluidClient, type FluidClient } from \"../client/fluid-client\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { useFluidAuthOptional } from \"./FluidAuthProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/portal-react/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/portal-widgets/contexts\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../client/types\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** Configured API client instance */\n readonly client: FluidClient;\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Portal SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/portal-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{\n * baseUrl: \"https://api.fluid.app/api\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps): React.JSX.Element {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(() => {\n const persister =\n typeof window !== \"undefined\" && !import.meta.env?.DEV\n ? createPersister()\n : undefined;\n\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n persister: persister?.persisterFn,\n },\n },\n });\n }, []);\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Recreate client only when baseUrl changes (primitive dependency).\n // Wrap callbacks in closures so they always read the latest from configRef,\n // avoiding stale captures when parent passes new getAuthToken/onAuthError.\n const client = useMemo(\n () =>\n createFluidClient({\n ...configRef.current,\n getAuthToken: () => configRef.current.getAuthToken?.() ?? null,\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Context value only changes when client changes\n const contextValue = useMemo(\n () => ({ client, config: configRef.current }) satisfies FluidContextValue,\n [client],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // getAuthToken is typically a synchronous cookie/localStorage read,\n // so we call it and use the result if it's a string (not a Promise).\n const getApiHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const getAuthToken = configRef.current.getAuthToken;\n if (typeof getAuthToken === \"function\") {\n const tokenOrPromise = getAuthToken();\n // Only use synchronous results — async tokens are handled by the SDK client\n if (typeof tokenOrPromise === \"string\") {\n headers.Authorization = `Bearer ${tokenOrPromise}`;\n }\n }\n\n return headers;\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Auto-derive rep_id from auth context for data source path interpolation\n const authContext = useFluidAuthOptional();\n\n const autoVariables = useMemo(() => {\n if (authContext?.user?.id != null) {\n return {\n rep_id: String(authContext.user.id),\n ...(authContext.user.company_id != null && {\n company_id: String(authContext.user.company_id),\n }),\n };\n }\n return undefined;\n }, [authContext?.user?.id, authContext?.user?.company_id]);\n\n // Explicit prop takes precedence over auto-derived variables\n const effectiveVariables = variables ?? autoVariables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <CustomerIdEnricher\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n registry={registry}\n themeProviderProps={themeProviderProps}\n onAuthError={config.onAuthError}\n >\n {children}\n </CustomerIdEnricher>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Inner component that enriches data source variables with customer_id.\n * Must be rendered inside FluidContext.Provider + QueryClientProvider.\n * Inlines the customer account fetch to avoid a circular dependency\n * (FluidProvider → useCustomerAccount → useFluidPayClient → FluidProvider).\n */\nfunction CustomerIdEnricher({\n baseUrl,\n getApiHeaders,\n variables,\n registry,\n themeProviderProps,\n onAuthError,\n children,\n}: {\n baseUrl: string;\n getApiHeaders: () => Record<string, string>;\n variables: Record<string, string> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registry: Record<string, React.ComponentType<any>>;\n themeProviderProps: Record<string, unknown>;\n onAuthError: (() => void) | undefined;\n children: ReactNode;\n}): React.JSX.Element {\n const authContext = useFluidAuthOptional();\n const token = authContext?.token ?? \"\";\n const userId = authContext?.user?.id;\n\n const fluidPayClient = useMemo(() => {\n const apiBase = baseUrl.endsWith(\"/api\")\n ? baseUrl\n : `${baseUrl.replace(/\\/+$/, \"\")}/api`;\n return createFluidPayFetchClient({\n baseUrl: apiBase,\n getAuthToken: () => token,\n onAuthError,\n });\n }, [baseUrl, token, onAuthError]);\n\n const { data: customerData } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(fluidPayClient, token),\n enabled: !!token,\n });\n const customerId = customerData?.customer?.id;\n\n const enrichedVariables = useMemo(() => {\n const base = variables ?? {};\n if (customerId == null) return variables;\n return { ...base, customer_id: String(customerId) };\n }, [variables, customerId]);\n\n return (\n <DataSourceRegistryProvider\n baseUrl={baseUrl}\n getApiHeaders={getApiHeaders}\n variables={enrichedVariables}\n >\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </DataSourceRegistryProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n"],"x_google_ignoreList":[2,3,4,5,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"mappings":"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"}