@plumile/backoffice-react 0.1.142 → 0.1.144

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 (230) hide show
  1. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  2. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  3. package/lib/esm/auth/authRefreshNotice.css.js +1 -1
  4. package/lib/esm/auth/login/AuthPanel.js.map +1 -1
  5. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  6. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  7. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  8. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  9. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  10. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  11. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  12. package/lib/esm/auth/login/loginPage.css.js +1 -1
  13. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  14. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
  15. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  16. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  17. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  18. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  19. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +14 -14
  20. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  21. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
  22. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  23. package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
  24. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
  25. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  26. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  27. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  28. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  29. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  30. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  32. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationList.js.map +1 -1
  33. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  34. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
  35. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
  36. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  37. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +1 -1
  38. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
  39. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +1 -1
  40. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  41. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  42. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -1
  43. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +1 -1
  44. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +13 -13
  46. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  47. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  48. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  49. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  50. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +2 -1
  51. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  52. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  53. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  54. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  55. package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js.map +1 -1
  56. package/lib/esm/components/backoffice/detail/detailPayloadUtils.js.map +1 -1
  57. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
  58. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  59. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  60. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
  61. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
  62. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  63. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  64. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
  65. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  66. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  67. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
  68. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  69. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  70. package/lib/esm/components/backoffice/layout/BackofficePermissionsContext.js.map +1 -1
  71. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  72. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
  73. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
  74. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  75. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.js.map +1 -1
  76. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
  77. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  78. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  79. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  80. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  81. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  82. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  83. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
  84. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
  85. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  86. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
  87. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
  88. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  89. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -1
  90. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -1
  91. package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -1
  92. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  93. package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
  94. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  95. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  96. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
  97. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  98. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  99. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  100. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  101. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  102. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +1 -2
  103. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  104. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
  105. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  106. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  107. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  108. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
  109. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  110. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  111. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  112. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js +1 -1
  113. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +1 -1
  114. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -1
  115. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
  116. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  117. package/lib/esm/components/backoffice/scaffolds/BackofficeListFilterContext.js.map +1 -1
  118. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  119. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  120. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  121. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  122. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
  123. package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
  124. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  125. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  126. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
  127. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  128. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
  129. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  130. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  131. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  132. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  133. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  134. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  135. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  136. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  137. package/lib/esm/components/backoffice/tools/parseToolJson.js.map +1 -1
  138. package/lib/esm/filters/filterHelpers.js.map +1 -1
  139. package/lib/esm/hooks/useAuth.js.map +1 -1
  140. package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
  141. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
  142. package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -1
  143. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  144. package/lib/esm/hooks/useBackofficeLoadMore.js.map +1 -1
  145. package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
  146. package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
  147. package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
  148. package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
  149. package/lib/esm/hooks/useInfiniteConnection.js.map +1 -1
  150. package/lib/esm/hooks/useRefetchNeededReload.js.map +1 -1
  151. package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
  152. package/lib/esm/i18n/createI18nInstance.js.map +1 -1
  153. package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -1
  154. package/lib/esm/i18n/resources.js.map +1 -1
  155. package/lib/esm/i18n/useBackofficeFormats.js.map +1 -1
  156. package/lib/esm/i18n/useBackofficeReactTranslation.js.map +1 -1
  157. package/lib/esm/i18n/useReviewStatusLabel.js.map +1 -1
  158. package/lib/esm/modules/base64.js.map +1 -1
  159. package/lib/esm/modules/formatFileSize.js.map +1 -1
  160. package/lib/esm/modules/webauthn.js.map +1 -1
  161. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -1
  162. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -1
  163. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -1
  164. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -1
  165. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -1
  166. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -1
  167. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +1 -1
  168. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +1 -1
  169. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -1
  170. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -1
  171. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -1
  172. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +1 -1
  173. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -1
  174. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js.map +1 -1
  175. package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +1 -1
  176. package/lib/esm/node_modules/invariant/browser.js.map +1 -1
  177. package/lib/esm/node_modules/relay-test-utils/index.js.map +1 -1
  178. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +1 -1
  179. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
  180. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +1 -1
  181. package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +1 -1
  182. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +1 -1
  183. package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
  184. package/lib/esm/pages/BackofficeDashboardPage.helpers.js.map +1 -1
  185. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  186. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  187. package/lib/esm/pages/BackofficeEntityDetailPage.helpers.js.map +1 -1
  188. package/lib/esm/pages/BackofficeEntityDetailPage.js +2 -2
  189. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  190. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  191. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -1
  192. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  193. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  194. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  195. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  196. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  197. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
  198. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
  199. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  200. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  201. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  202. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  203. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
  204. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  205. package/lib/esm/pages/detail/pageResolution.js.map +1 -1
  206. package/lib/esm/provider/BackofficeConfigContext.js.map +1 -1
  207. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  208. package/lib/esm/provider/dashboardRegistrations.js.map +1 -1
  209. package/lib/esm/provider/entityRegistry.js.map +1 -1
  210. package/lib/esm/provider/lazyValue.js.map +1 -1
  211. package/lib/esm/provider/useBackofficeEntityLoader.js.map +1 -1
  212. package/lib/esm/provider/useBackofficeLazyValue.js.map +1 -1
  213. package/lib/esm/relay/RelayProvider.js.map +1 -1
  214. package/lib/esm/relay/connectionUtils.js.map +1 -1
  215. package/lib/esm/relay/createInlineReader.js.map +1 -1
  216. package/lib/esm/relay/envHelpers.js.map +1 -1
  217. package/lib/esm/relay/environment.js.map +1 -1
  218. package/lib/esm/relay/mutationResult.js.map +1 -1
  219. package/lib/esm/router/backofficeAuthPaths.js.map +1 -1
  220. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  221. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  222. package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
  223. package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
  224. package/lib/esm/style.css +1 -1
  225. package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
  226. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +1 -1
  227. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +1 -1
  228. package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
  229. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
  230. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"RelayProvider.js","names":[],"sources":["../../../src/relay/RelayProvider.tsx"],"sourcesContent":["import { useSyncExternalStore, type JSX, type ReactNode } from 'react';\nimport * as ReactRelay from 'react-relay';\n\nimport {\n getEnvironment,\n getRelayTransportSnapshot,\n subscribeRelayTransport,\n} from './environment.js';\n\nconst { RelayEnvironmentProvider } = ReactRelay;\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const RelayProvider = ({ children }: Props): JSX.Element => {\n useSyncExternalStore(\n subscribeRelayTransport,\n () => {\n return getRelayTransportSnapshot().generation;\n },\n () => {\n return getRelayTransportSnapshot().generation;\n },\n );\n const environment = getEnvironment();\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n {children}\n </RelayEnvironmentProvider>\n );\n};\n\nexport default RelayProvider;\n"],"mappings":";;;;;AASA,IAAM,EAAE,0BAAA,MAA6B,GAMxB,KAAiB,EAAE,mBAC9B,EACE,SAES,GAA2B,CAAC,kBAG5B,GAA2B,CAAC,WAEtC,EAIC,kBAAC,GAAD;CAAuC,aAHrB,GAGqB;CACpC;CACwB,CAAA"}
1
+ {"version":3,"file":"RelayProvider.js","names":[],"sources":["../../../src/relay/RelayProvider.tsx"],"sourcesContent":["import { useSyncExternalStore, type JSX, type ReactNode } from 'react';\nimport * as ReactRelay from 'react-relay';\n\nimport {\n getEnvironment,\n getRelayTransportSnapshot,\n subscribeRelayTransport,\n} from './environment.js';\n\nconst { RelayEnvironmentProvider } = ReactRelay;\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const RelayProvider = ({ children }: Props): JSX.Element => {\n useSyncExternalStore(\n subscribeRelayTransport,\n () => {\n return getRelayTransportSnapshot().generation;\n },\n () => {\n return getRelayTransportSnapshot().generation;\n },\n );\n const environment = getEnvironment();\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n {children}\n </RelayEnvironmentProvider>\n );\n};\n\nexport default RelayProvider;\n"],"mappings":";;;;;AASA,IAAM,EAAE,0BAAA,MAA6B,GAMxB,KAAiB,EAAE,mBAC9B,EACE,SAES,EAA0B,EAAE,kBAG5B,EAA0B,EAAE,UAEvC,GAIE,kBAAC,GAAD;CAAuC,aAHrB,EAGqB;CACpC;AACuB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"connectionUtils.js","names":[],"sources":["../../../src/relay/connectionUtils.ts"],"sourcesContent":["import RelayRuntime, {\n type RecordProxy,\n type RecordSourceSelectorProxy,\n} from 'relay-runtime';\n\nconst { ConnectionHandler } = RelayRuntime;\n\nexport type AppendNodeToConnectionsOptions = {\n store: RecordSourceSelectorProxy;\n parentId: string;\n connectionKeys: readonly string[];\n node: RecordProxy;\n edgeTypeName: string;\n};\n\n/** Appends a node to existing Relay connections on the parent record. */\nexport function appendNodeToConnections(\n options: AppendNodeToConnectionsOptions,\n): void {\n const { store, parentId, connectionKeys, node, edgeTypeName } = options;\n const parentRecord = store.get(parentId);\n if (parentRecord == null) {\n return;\n }\n\n const nodeId = node.getDataID();\n const uniqueKeys = Array.from(new Set(connectionKeys)).filter((key) => {\n return key.trim() !== '';\n });\n\n for (const connectionKey of uniqueKeys) {\n const connection = ConnectionHandler.getConnection(\n parentRecord,\n connectionKey,\n );\n if (connection != null) {\n const edges = connection.getLinkedRecords('edges') ?? [];\n const alreadyPresent = edges.some((edge) => {\n const edgeNode = edge.getLinkedRecord('node');\n return edgeNode?.getDataID() === nodeId;\n });\n\n if (!alreadyPresent) {\n const newEdge = ConnectionHandler.createEdge(\n store,\n connection,\n node,\n edgeTypeName,\n );\n ConnectionHandler.insertEdgeAfter(connection, newEdge);\n }\n }\n }\n}\n"],"mappings":";;AAKA,IAAM,EAAE,yBAAsB;AAW9B,SAAgB,EACd,GACM;CACN,IAAM,EAAE,UAAO,aAAU,mBAAgB,SAAM,oBAAiB,GAC1D,IAAe,EAAM,IAAI,EAAS;CACxC,IAAI,KAAgB,MAClB;CAGF,IAAM,IAAS,EAAK,WAAW,EACzB,IAAa,MAAM,KAAK,IAAI,IAAI,EAAe,CAAC,CAAC,QAAQ,MACtD,EAAI,MAAM,KAAK,GACtB;CAEF,KAAK,IAAM,KAAiB,GAAY;EACtC,IAAM,IAAa,EAAkB,cACnC,GACA,EACD;EACD,IAAI,KAAc,QAOZ,EANU,EAAW,iBAAiB,QAAQ,IAAI,EAAE,EAC3B,MAAM,MAChB,EAAK,gBAAgB,OAC/B,EAAU,WAAW,KAAK,EAG9B,EAAgB;GACnB,IAAM,IAAU,EAAkB,WAChC,GACA,GACA,GACA,EACD;GACD,EAAkB,gBAAgB,GAAY,EAAQ"}
1
+ {"version":3,"file":"connectionUtils.js","names":[],"sources":["../../../src/relay/connectionUtils.ts"],"sourcesContent":["import RelayRuntime, {\n type RecordProxy,\n type RecordSourceSelectorProxy,\n} from 'relay-runtime';\n\nconst { ConnectionHandler } = RelayRuntime;\n\nexport type AppendNodeToConnectionsOptions = {\n store: RecordSourceSelectorProxy;\n parentId: string;\n connectionKeys: readonly string[];\n node: RecordProxy;\n edgeTypeName: string;\n};\n\n/** Appends a node to existing Relay connections on the parent record. */\nexport function appendNodeToConnections(\n options: AppendNodeToConnectionsOptions,\n): void {\n const { store, parentId, connectionKeys, node, edgeTypeName } = options;\n const parentRecord = store.get(parentId);\n if (parentRecord == null) {\n return;\n }\n\n const nodeId = node.getDataID();\n const uniqueKeys = Array.from(new Set(connectionKeys)).filter((key) => {\n return key.trim() !== '';\n });\n\n for (const connectionKey of uniqueKeys) {\n const connection = ConnectionHandler.getConnection(\n parentRecord,\n connectionKey,\n );\n if (connection != null) {\n const edges = connection.getLinkedRecords('edges') ?? [];\n const alreadyPresent = edges.some((edge) => {\n const edgeNode = edge.getLinkedRecord('node');\n return edgeNode?.getDataID() === nodeId;\n });\n\n if (!alreadyPresent) {\n const newEdge = ConnectionHandler.createEdge(\n store,\n connection,\n node,\n edgeTypeName,\n );\n ConnectionHandler.insertEdgeAfter(connection, newEdge);\n }\n }\n }\n}\n"],"mappings":";;AAKA,IAAM,EAAE,yBAAsB;AAW9B,SAAgB,EACd,GACM;CACN,IAAM,EAAE,UAAO,aAAU,mBAAgB,SAAM,oBAAiB,GAC1D,IAAe,EAAM,IAAI,CAAQ;CACvC,IAAI,KAAgB,MAClB;CAGF,IAAM,IAAS,EAAK,UAAU,GACxB,IAAa,MAAM,KAAK,IAAI,IAAI,CAAc,CAAC,EAAE,QAAQ,MACtD,EAAI,KAAK,MAAM,EACvB;CAED,KAAK,IAAM,KAAiB,GAAY;EACtC,IAAM,IAAa,EAAkB,cACnC,GACA,CACF;EACA,IAAI,KAAc,QAOZ,EANU,EAAW,iBAAiB,OAAO,KAAK,CAAC,GAC1B,MAAM,MAChB,EAAK,gBAAgB,MAC/B,GAAU,UAAU,MAAM,CAG9B,GAAgB;GACnB,IAAM,IAAU,EAAkB,WAChC,GACA,GACA,GACA,CACF;GACA,EAAkB,gBAAgB,GAAY,CAAO;EACvD;CAEJ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nconst { readInlineData } = ReactRelay;\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readInlineData(fragment, ref as never);\n };\n};\n\n// Legacy alias kept for incremental migration of existing callsites.\nexport const createInlineReader = createInlineDataReader;\n"],"mappings":";;AAGA,IAAM,EAAE,sBAAmB,GAGd,KACX,OAEQ,MACC,EAAe,GAAU,EAAa,EAKpC,IAAqB"}
1
+ {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nconst { readInlineData } = ReactRelay;\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readInlineData(fragment, ref as never);\n };\n};\n\n// Legacy alias kept for incremental migration of existing callsites.\nexport const createInlineReader = createInlineDataReader;\n"],"mappings":";;AAGA,IAAM,EAAE,sBAAmB,GAGd,KACX,OAEQ,MACC,EAAe,GAAU,CAAY,GAKnC,IAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"envHelpers.js","names":[],"sources":["../../../src/relay/envHelpers.ts"],"sourcesContent":["type EnvRecord = Record<string, string | boolean | undefined>;\n\nconst viteEnv: EnvRecord = (() => {\n try {\n const meta = import.meta as unknown as { env?: EnvRecord };\n if (meta.env != null) {\n return meta.env;\n }\n return {};\n } catch {\n // `import.meta` is not defined outside of ESM environments; fall back to an empty record.\n return {};\n }\n})();\n\nexport type ReadEnvFn = (key: string) => string | undefined;\n\nconst readEnvFromRecord = (env: EnvRecord, key: string): string | undefined => {\n const value = env[key];\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n if (trimmed === '') {\n return undefined;\n }\n\n return trimmed;\n};\n\nconst readBooleanEnvFromRecord = (\n env: EnvRecord,\n key: string,\n): boolean | undefined => {\n const value = env[key];\n if (value === true || value === false) {\n return value;\n }\n if (typeof value === 'string') {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n }\n return undefined;\n};\n\nconst isDevEnvFromRecord = (env: EnvRecord): boolean => {\n return Boolean(readBooleanEnvFromRecord(env, 'DEV'));\n};\n\n/**\n * Read a string environment variable from Vite's `import.meta.env` (if available).\n * Returns `undefined` when the value is missing or empty.\n */\nexport function readEnv(key: string): string | undefined {\n return readEnvFromRecord(viteEnv, key);\n}\n\n/**\n * Reads an environment variable and coerces common string values to booleans.\n */\nexport function readBooleanEnv(key: string): boolean | undefined {\n return readBooleanEnvFromRecord(viteEnv, key);\n}\n\n/**\n * Indicates whether the current build is running in development mode.\n */\nexport function isDevEnv(): boolean {\n return isDevEnvFromRecord(viteEnv);\n}\n\ninterface ResolveEndpointOptions {\n envKeys: readonly string[];\n fallback: string;\n read?: ReadEnvFn;\n}\n\n/**\n * Resolve HTTP endpoint from environment variables.\n */\nexport function resolveHttpEndpoint(options: ResolveEndpointOptions): string {\n const { envKeys, fallback, read = readEnv } = options;\n for (const key of envKeys) {\n const value = read(key);\n if (value != null) {\n return value;\n }\n }\n return fallback;\n}\n\ninterface ResolveWebsocketEndpointOptions extends ResolveEndpointOptions {\n httpEndpoint: string;\n}\n\n/**\n * Resolve websocket endpoint from environment variables or derive it from the HTTP endpoint.\n */\nexport function resolveWebsocketEndpoint(\n options: ResolveWebsocketEndpointOptions,\n): string {\n const { envKeys, fallback, httpEndpoint, read = readEnv } = options;\n\n for (const key of envKeys) {\n const value = read(key);\n if (value != null) {\n return value;\n }\n }\n\n if (httpEndpoint.startsWith('http')) {\n return httpEndpoint.replace(/^http/, 'ws');\n }\n\n if (httpEndpoint.startsWith('/')) {\n return httpEndpoint.replace(/\\/graphql$/, '/ws');\n }\n\n return fallback;\n}\n\nexport const __test = {\n isDevEnvFromRecord,\n readBooleanEnvFromRecord,\n readEnvFromRecord,\n};\n"],"mappings":";AAEA,IAAM,WAA4B;CAChC,IAAI;EACF,IAAM,IAAO,OAAO;EAIpB,OAHI,EAAK,OAAO,OAGT,EAAE,GAFA,EAAK;SAGR;EAEN,OAAO,EAAE;;IAET,EAIE,KAAqB,GAAgB,MAAoC;CAC7E,IAAM,IAAQ,EAAI;CAClB,IAAI,OAAO,KAAU,UACnB;CAGF,IAAM,IAAU,EAAM,MAAM;CACxB,UAAY,IAIhB,OAAO;GAGH,KACJ,GACA,MACwB;CACxB,IAAM,IAAQ,EAAI;CAClB,IAAI,MAAU,MAAQ,MAAU,IAC9B,OAAO;CAET,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAI,MAAU,QACZ,OAAO;EAET,IAAI,MAAU,SACZ,OAAO;;GAMP,KAAsB,MACnB,EAAQ,EAAyB,GAAK,MAAM;AAOrD,SAAgB,EAAQ,GAAiC;CACvD,OAAO,EAAkB,GAAS,EAAI;;AAMxC,SAAgB,EAAe,GAAkC;CAC/D,OAAO,EAAyB,GAAS,EAAI;;AAM/C,SAAgB,IAAoB;CAClC,OAAO,EAAmB,EAAQ;;AAYpC,SAAgB,EAAoB,GAAyC;CAC3E,IAAM,EAAE,YAAS,aAAU,UAAO,MAAY;CAC9C,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAQ,EAAK,EAAI;EACvB,IAAI,KAAS,MACX,OAAO;;CAGX,OAAO;;AAUT,SAAgB,EACd,GACQ;CACR,IAAM,EAAE,YAAS,aAAU,iBAAc,UAAO,MAAY;CAE5D,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAQ,EAAK,EAAI;EACvB,IAAI,KAAS,MACX,OAAO;;CAYX,OARI,EAAa,WAAW,OAAO,GAC1B,EAAa,QAAQ,SAAS,KAAK,GAGxC,EAAa,WAAW,IAAI,GACvB,EAAa,QAAQ,cAAc,MAAM,GAG3C;;AAGT,IAAa,IAAS;CACpB;CACA;CACA;CACD"}
1
+ {"version":3,"file":"envHelpers.js","names":[],"sources":["../../../src/relay/envHelpers.ts"],"sourcesContent":["type EnvRecord = Record<string, string | boolean | undefined>;\n\nconst viteEnv: EnvRecord = (() => {\n try {\n const meta = import.meta as unknown as { env?: EnvRecord };\n if (meta.env != null) {\n return meta.env;\n }\n return {};\n } catch {\n // `import.meta` is not defined outside of ESM environments; fall back to an empty record.\n return {};\n }\n})();\n\nexport type ReadEnvFn = (key: string) => string | undefined;\n\nconst readEnvFromRecord = (env: EnvRecord, key: string): string | undefined => {\n const value = env[key];\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n if (trimmed === '') {\n return undefined;\n }\n\n return trimmed;\n};\n\nconst readBooleanEnvFromRecord = (\n env: EnvRecord,\n key: string,\n): boolean | undefined => {\n const value = env[key];\n if (value === true || value === false) {\n return value;\n }\n if (typeof value === 'string') {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n }\n return undefined;\n};\n\nconst isDevEnvFromRecord = (env: EnvRecord): boolean => {\n return Boolean(readBooleanEnvFromRecord(env, 'DEV'));\n};\n\n/**\n * Read a string environment variable from Vite's `import.meta.env` (if available).\n * Returns `undefined` when the value is missing or empty.\n */\nexport function readEnv(key: string): string | undefined {\n return readEnvFromRecord(viteEnv, key);\n}\n\n/**\n * Reads an environment variable and coerces common string values to booleans.\n */\nexport function readBooleanEnv(key: string): boolean | undefined {\n return readBooleanEnvFromRecord(viteEnv, key);\n}\n\n/**\n * Indicates whether the current build is running in development mode.\n */\nexport function isDevEnv(): boolean {\n return isDevEnvFromRecord(viteEnv);\n}\n\ninterface ResolveEndpointOptions {\n envKeys: readonly string[];\n fallback: string;\n read?: ReadEnvFn;\n}\n\n/**\n * Resolve HTTP endpoint from environment variables.\n */\nexport function resolveHttpEndpoint(options: ResolveEndpointOptions): string {\n const { envKeys, fallback, read = readEnv } = options;\n for (const key of envKeys) {\n const value = read(key);\n if (value != null) {\n return value;\n }\n }\n return fallback;\n}\n\ninterface ResolveWebsocketEndpointOptions extends ResolveEndpointOptions {\n httpEndpoint: string;\n}\n\n/**\n * Resolve websocket endpoint from environment variables or derive it from the HTTP endpoint.\n */\nexport function resolveWebsocketEndpoint(\n options: ResolveWebsocketEndpointOptions,\n): string {\n const { envKeys, fallback, httpEndpoint, read = readEnv } = options;\n\n for (const key of envKeys) {\n const value = read(key);\n if (value != null) {\n return value;\n }\n }\n\n if (httpEndpoint.startsWith('http')) {\n return httpEndpoint.replace(/^http/, 'ws');\n }\n\n if (httpEndpoint.startsWith('/')) {\n return httpEndpoint.replace(/\\/graphql$/, '/ws');\n }\n\n return fallback;\n}\n\nexport const __test = {\n isDevEnvFromRecord,\n readBooleanEnvFromRecord,\n readEnvFromRecord,\n};\n"],"mappings":";AAEA,IAAM,WAA4B;CAChC,IAAI;EACF,IAAM,IAAO,OAAO;EAIpB,OAHI,EAAK,OAAO,OAGT,CAAC,IAFC,EAAK;CAGhB,QAAQ;EAEN,OAAO,CAAC;CACV;AACF,GAAG,GAIG,KAAqB,GAAgB,MAAoC;CAC7E,IAAM,IAAQ,EAAI;CAClB,IAAI,OAAO,KAAU,UACnB;CAGF,IAAM,IAAU,EAAM,KAAK;CACvB,UAAY,IAIhB,OAAO;AACT,GAEM,KACJ,GACA,MACwB;CACxB,IAAM,IAAQ,EAAI;CAClB,IAAI,MAAU,MAAQ,MAAU,IAC9B,OAAO;CAET,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAI,MAAU,QACZ,OAAO;EAET,IAAI,MAAU,SACZ,OAAO;CAEX;AAEF,GAEM,KAAsB,MACnB,EAAQ,EAAyB,GAAK,KAAK;AAOpD,SAAgB,EAAQ,GAAiC;CACvD,OAAO,EAAkB,GAAS,CAAG;AACvC;AAKA,SAAgB,EAAe,GAAkC;CAC/D,OAAO,EAAyB,GAAS,CAAG;AAC9C;AAKA,SAAgB,IAAoB;CAClC,OAAO,EAAmB,CAAO;AACnC;AAWA,SAAgB,EAAoB,GAAyC;CAC3E,IAAM,EAAE,YAAS,aAAU,UAAO,MAAY;CAC9C,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAQ,EAAK,CAAG;EACtB,IAAI,KAAS,MACX,OAAO;CAEX;CACA,OAAO;AACT;AASA,SAAgB,EACd,GACQ;CACR,IAAM,EAAE,YAAS,aAAU,iBAAc,UAAO,MAAY;CAE5D,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAQ,EAAK,CAAG;EACtB,IAAI,KAAS,MACX,OAAO;CAEX;CAUA,OARI,EAAa,WAAW,MAAM,IACzB,EAAa,QAAQ,SAAS,IAAI,IAGvC,EAAa,WAAW,GAAG,IACtB,EAAa,QAAQ,cAAc,KAAK,IAG1C;AACT;AAEA,IAAa,IAAS;CACpB;CACA;CACA;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","names":[],"sources":["../../../src/relay/environment.ts"],"sourcesContent":["import {\n Environment,\n Network,\n Observable,\n RecordSource,\n Store,\n type FetchFunction,\n type SubscribeFunction,\n type RelayFieldLogger,\n} from 'relay-runtime';\nimport { createClient, type Client } from 'graphql-ws';\nimport { isDevEnv } from './envHelpers.js';\n\nlet graphqlHttpEndpoint = '/api/graphql';\nlet graphqlWsEndpoint = '/api/ws';\n\n// (anonymousEnvironment reserved if needed later for public access / logout scenarios)\n// Removed until actually required to avoid lint errors.\n// let anonymousEnvironment: Environment | undefined;\nlet environment: Environment | undefined;\nlet wsClient: Client | undefined;\nlet getAuthHeaders:\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\nlet customDataIdResolver:\n | ((fieldValue: unknown, typeName: string) => string | null)\n | undefined;\n\nexport type RelayTransportStatus = 'idle' | 'configured' | 'reconnecting';\n\nexport interface RelayTransportSnapshot {\n generation: number;\n reason: string | null;\n status: RelayTransportStatus;\n}\n\nexport interface RelayReconnectOptions {\n reason?: string;\n}\n\ntype RelayTransportListener = () => void;\n\nlet relayTransportSnapshot: RelayTransportSnapshot = {\n generation: 0,\n reason: null,\n status: 'idle',\n};\nconst relayTransportListeners = new Set<RelayTransportListener>();\n\n/**\n * No-op Relay field logger used to satisfy @required(action: LOG).\n */\nfunction noopRelayFieldLogger(): void {}\n\nlet relayFieldLogger: RelayFieldLogger = noopRelayFieldLogger;\n\nif (isDevEnv()) {\n relayFieldLogger = (event) => {\n // eslint-disable-next-line no-console\n console.log('relayFieldLogger: ', event);\n };\n}\n\nconst defaultGetDataId: (\n fieldValue: unknown,\n typeName: string,\n) => string | null = (fieldValue) => {\n if (fieldValue == null || typeof fieldValue !== 'object') {\n return null;\n }\n const { id } = fieldValue as { id?: unknown };\n if (typeof id !== 'string' || id.trim() === '') {\n return null;\n }\n return id;\n};\n\nconst getDataId = (fieldValue: unknown, typeName: string): string | null => {\n const customId = customDataIdResolver?.(fieldValue, typeName);\n if (customId != null) {\n return customId;\n }\n return defaultGetDataId(fieldValue, typeName);\n};\n\n/**\n * Notify subscribers that the Relay transport state changed.\n */\nfunction emitRelayTransportChange(\n status: RelayTransportStatus,\n reason: string | null,\n): void {\n relayTransportSnapshot = {\n generation: relayTransportSnapshot.generation + 1,\n reason,\n status,\n };\n for (const listener of relayTransportListeners) {\n listener();\n }\n}\n\n/**\n * Dispose the active websocket client and ignore shutdown failures.\n */\nfunction disposeWsClient(): void {\n if (wsClient == null) {\n return;\n }\n try {\n const result = wsClient.dispose();\n if (result instanceof Promise) {\n result.catch(() => {\n // ignore dispose rejections\n });\n }\n } catch {\n // ignore errors during dispose\n }\n wsClient = undefined;\n}\n\n/**\n * Return the current Relay transport state used by subscription hooks.\n */\nexport function getRelayTransportSnapshot(): RelayTransportSnapshot {\n return relayTransportSnapshot;\n}\n\n/**\n * Subscribe to Relay transport changes.\n */\nexport function subscribeRelayTransport(\n listener: RelayTransportListener,\n): () => void {\n relayTransportListeners.add(listener);\n return () => {\n relayTransportListeners.delete(listener);\n };\n}\n\n/**\n * Force the websocket transport to reconnect and notify mounted subscriptions.\n */\nexport function reconnectRelayWebSocket(\n options: RelayReconnectOptions = {},\n): void {\n disposeWsClient();\n emitRelayTransportChange(\n 'reconnecting',\n options.reason ?? 'manual_reconnect',\n );\n}\n\nexport interface RelayEnvironmentConfiguration {\n httpUrl?: string;\n wsUrl?: string;\n logEvents?: boolean;\n getDataId?: (fieldValue: unknown, typeName: string) => string | null;\n getAuthHeaders?: () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n}\n\n/**\n * Configure the endpoints and logging behavior used by the shared Relay environment.\n */\nexport function configureRelayEnvironment(\n options: RelayEnvironmentConfiguration = {},\n): void {\n const {\n httpUrl,\n wsUrl,\n logEvents,\n getDataId: nextGetDataId,\n getAuthHeaders: nextGetAuthHeaders,\n } = options;\n\n if (typeof httpUrl === 'string' && httpUrl !== '') {\n graphqlHttpEndpoint = httpUrl;\n }\n\n if (typeof wsUrl === 'string' && wsUrl !== '') {\n graphqlWsEndpoint = wsUrl;\n }\n\n if (logEvents != null) {\n if (logEvents) {\n relayFieldLogger = (event) => {\n // eslint-disable-next-line no-console\n console.log('relayFieldLogger: ', event);\n };\n } else {\n relayFieldLogger = noopRelayFieldLogger;\n }\n }\n\n customDataIdResolver = nextGetDataId;\n getAuthHeaders = nextGetAuthHeaders;\n\n disposeWsClient();\n environment = undefined;\n emitRelayTransportChange('configured', 'configure');\n}\n\n/**\n * Resolve the websocket endpoint into an absolute URL suitable for graphql-ws.\n */\nfunction resolveWebsocketUrl(): string {\n const endpoint = graphqlWsEndpoint;\n\n if (endpoint.startsWith('ws')) {\n return endpoint;\n }\n\n if (endpoint.startsWith('http')) {\n return endpoint.replace(/^http/, 'ws');\n }\n\n if (endpoint.startsWith('/')) {\n if (typeof window === 'undefined') {\n return endpoint;\n }\n let protocol = 'ws:';\n if (window.location.protocol === 'https:') {\n protocol = 'wss:';\n }\n return `${protocol}//${window.location.host}${endpoint}`;\n }\n\n return endpoint;\n}\n\n/**\n * Build or get a singleton graphql-ws client with basic auto-reconnect.\n * The graphql-ws library already supports lazy connections and we add retry logic.\n */\nfunction getWsClient(): Client {\n if (wsClient != null) {\n return wsClient;\n }\n if (typeof window === 'undefined') {\n throw new Error(\n 'GraphQL subscriptions unavailable in non-browser environment',\n );\n }\n\n const url = resolveWebsocketUrl();\n\n // Exponential backoff parameters\n const maxAttempts = 10;\n const baseDelayMs = 500;\n\n wsClient = createClient({\n url,\n keepAlive: 10_000,\n lazy: true,\n retryAttempts: maxAttempts,\n shouldRetry() {\n return true;\n },\n async retryWait(retries) {\n // retries starts at 0\n const delay =\n Math.min(8000, baseDelayMs * 2 ** retries) + Math.random() * 200;\n await new Promise<void>((resolve) => {\n setTimeout(() => {\n resolve();\n }, delay);\n });\n },\n connectionParams: async () => {\n if (getAuthHeaders == null) {\n return {};\n }\n try {\n return await getAuthHeaders();\n } catch {\n return {};\n }\n },\n });\n\n return wsClient;\n}\n\n/**\n * Get organization slug from current window location\n */\n// export function getOrganizationSlug(): string | null {\n// const { pathname } = window.location;\n// const slug = pathname.split('/')[1];\n// if (slug == null) {\n// return null;\n// }\n\n// return slug;\n// }\n\n// -------------------------\n// Upload detection helpers\n// -------------------------\n/** Test if a value is an uploadable (File/Blob) */\nfunction isUploadable(value: unknown): value is File | Blob {\n return (\n (typeof File !== 'undefined' && value instanceof File) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n );\n}\n\ninterface FileRef {\n path: string; // JSON pointer-like (e.g. variables.input.file)\n file: File | Blob;\n}\n\n/** Recursively clone a structure replacing files with null and collecting them */\nfunction collectFiles(value: unknown, path: string, acc: FileRef[]): unknown {\n if (isUploadable(value)) {\n acc.push({ path, file: value });\n return null; // placeholder per multipart spec\n }\n if (Array.isArray(value)) {\n return value.map((v, i) => {\n return collectFiles(v, `${path}.${i}`, acc);\n });\n }\n if (value != null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = collectFiles(v, `${path}.${k}`, acc);\n }\n return out;\n }\n return value; // primitives unchanged\n}\n\n/** Build GraphQL multipart form-data payload */\nfunction buildFormData(\n query: string,\n variables: Record<string, unknown>,\n): FormData {\n const files: FileRef[] = [];\n // Deep clone variables while replacing files with null\n const clonedVars = collectFiles(variables, 'variables', files) as Record<\n string,\n unknown\n >;\n\n const form = new FormData();\n const operations = { query, variables: clonedVars };\n form.append('operations', JSON.stringify(operations));\n\n const map: Record<string, string[]> = {};\n files.forEach((ref, idx) => {\n map[idx] = [ref.path];\n });\n form.append('map', JSON.stringify(map));\n files.forEach((ref, idx) => {\n form.append(String(idx), ref.file);\n });\n return form;\n}\n\n// -------------------------\n// Retry / timeout helpers\n// -------------------------\ninterface RetryOptions {\n maxAttempts: number; // total attempts including initial\n baseDelayMs: number;\n maxDelayMs: number;\n fetchTimeoutMs: number;\n}\n\nconst RETRY_OPTIONS: RetryOptions = {\n maxAttempts: 3,\n baseDelayMs: 300,\n maxDelayMs: 4000,\n fetchTimeoutMs: 600_000, // 10 minutes (parité avec ancien middleware)\n};\n\n/** Sleep helper with Promise */\nasync function sleep(ms: number): Promise<void> {\n await new Promise<void>((res) => {\n setTimeout(() => {\n res();\n }, ms);\n });\n}\n\n/** Exponential backoff with jitter */\nfunction calcBackoff(attempt: number, opts: RetryOptions): number {\n const exp = Math.min(opts.maxDelayMs, opts.baseDelayMs * 2 ** attempt);\n return exp + Math.random() * 0.2 * exp; // jitter 0-20%\n}\n\n/** Determine if an HTTP status is retryable */\nfunction isRetryableStatus(status: number): boolean {\n return status === 408 || status === 429 || (status >= 500 && status < 600);\n}\n\n/** Determine if an error should be treated as transient network issue */\nfunction isNetworkError(err: unknown): boolean {\n return (\n err instanceof TypeError ||\n (err instanceof Error && err.name === 'AbortError')\n );\n}\n\n// -------------------------\n// fetchFn implementation\n// -------------------------\ninterface GraphQLResponseErrorItem {\n [key: string]: unknown;\n message: string;\n}\n\ninterface GraphQLResponseShape<T = unknown> {\n data?: T;\n errors?: GraphQLResponseErrorItem[];\n extensions?: Record<string, unknown>;\n}\n\n/** Debug log helper (no-op en production) */\nfunction debugLog(...args: unknown[]): void {\n if (isDevEnv()) {\n // eslint-disable-next-line no-console\n console.log('[RelayNetwork]', ...args);\n }\n}\n\n/** Fetch GraphQL (with retry + upload) */\nasync function fetchFn(\n request: { text: string | null | undefined },\n variables: Record<string, unknown>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _cacheConfig: unknown,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _uploadables: unknown,\n): Promise<GraphQLResponseShape> {\n const queryText: string | null | undefined = request.text; // no persisted queries here (yet)\n if (queryText == null) {\n throw new Error('Missing GraphQL query text');\n }\n const safeQueryText: string = queryText; // narrowed non-null\n\n /** Execute one network attempt */\n async function execOnce(attempt: number): Promise<GraphQLResponseShape> {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, RETRY_OPTIONS.fetchTimeoutMs);\n try {\n let body: BodyInit;\n const headers: Record<string, string> = {};\n if (getAuthHeaders != null) {\n try {\n Object.assign(headers, await getAuthHeaders());\n } catch {\n // ignore auth header failures\n }\n }\n const hasFiles = ((): boolean => {\n try {\n const stack: unknown[] = [variables];\n while (stack.length > 0) {\n const v = stack.pop();\n if (isUploadable(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n stack.push(...v);\n } else if (v != null && typeof v === 'object') {\n stack.push(...Object.values(v as Record<string, unknown>));\n }\n }\n } catch {\n // ignore traversal errors\n }\n return false;\n })();\n\n if (hasFiles) {\n body = buildFormData(safeQueryText, variables);\n } else {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify({ query: safeQueryText, variables });\n }\n\n const response = await fetch(graphqlHttpEndpoint, {\n method: 'POST',\n body,\n headers,\n credentials: 'include',\n signal: controller.signal,\n });\n\n if (!response.ok) {\n if (\n attempt < RETRY_OPTIONS.maxAttempts - 1 &&\n isRetryableStatus(response.status)\n ) {\n throw new Error(`Retryable HTTP status ${response.status}`);\n }\n const text = await response.text().catch(() => {\n return '';\n });\n throw new Error(`GraphQL HTTP error ${response.status}: ${text}`);\n }\n\n const json: GraphQLResponseShape = await response.json();\n if (Array.isArray(json.errors) && json.errors.length > 0) {\n debugLog('GraphQL errors', json.errors);\n }\n return json;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n for (let attempt = 0; attempt < RETRY_OPTIONS.maxAttempts; attempt += 1) {\n try {\n return await execOnce(attempt);\n } catch (err) {\n const last = attempt === RETRY_OPTIONS.maxAttempts - 1;\n const retryable =\n isNetworkError(err) ||\n (err instanceof Error && err.message.includes('Retryable HTTP status'));\n if (!retryable || last) {\n debugLog('GraphQL fetch error', err);\n throw err;\n }\n const delay = calcBackoff(attempt, RETRY_OPTIONS);\n await sleep(delay);\n }\n }\n throw new Error('Exhausted retries without returning a result');\n}\n\n// -------------------------\n// subscribeFn implementation (wrap existing logic in Relay Observable)\n// -------------------------\n/** Subscription function bridging graphql-ws client to Relay */\nfunction subscribeFn(\n operation: { text: string | null | undefined; name: string },\n variables: Record<string, unknown>,\n): Observable<unknown> {\n debugLog('subscription:start', operation.name, variables);\n return Observable.create<unknown>((sink) => {\n const query = operation.text;\n if (query == null || query === '') {\n sink.error(new Error('Subscription operation text is empty'));\n return () => {\n // noop\n };\n }\n const client = getWsClient();\n const dispose = client.subscribe(\n { query, variables, operationName: operation.name },\n {\n next: (data) => {\n sink.next(data);\n },\n error: (err) => {\n let errorObj: Error;\n if (err instanceof Error) {\n errorObj = err;\n } else {\n errorObj = new Error('Subscription error');\n }\n sink.error(errorObj);\n },\n complete: () => {\n sink.complete();\n },\n },\n );\n return () => {\n dispose();\n };\n });\n}\n\n/**\n * Create native Relay network layer (fetch + subscribe)\n */\nexport function getNetwork(): ReturnType<typeof Network.create> {\n return Network.create(\n fetchFn as FetchFunction,\n subscribeFn as SubscribeFunction,\n );\n}\n\n/**\n * Get anonymous relay environment\n */\nexport function getEnvironment(): Environment {\n environment ??= new Environment({\n getDataID: getDataId,\n relayFieldLogger,\n network: getNetwork(),\n store: new Store(new RecordSource()),\n });\n\n return environment;\n}\n\n/**\n * Reset the Relay store by creating a new empty source\n */\nexport function resetRelayStore(): void {\n const environment = getEnvironment();\n\n // Create a new store with an empty source\n const source = new RecordSource();\n\n // Replace the data in the store with our empty source\n environment.getStore().publish(source);\n\n // Notify subscribers that the data has changed\n environment.getStore().notify();\n}\n\nexport const __test = {\n buildFormData,\n calcBackoff,\n collectFiles,\n getDataId,\n isNetworkError,\n isRetryableStatus,\n isUploadable,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"environment.js","names":[],"sources":["../../../src/relay/environment.ts"],"sourcesContent":["import {\n Environment,\n Network,\n Observable,\n RecordSource,\n Store,\n type FetchFunction,\n type SubscribeFunction,\n type RelayFieldLogger,\n} from 'relay-runtime';\nimport { createClient, type Client } from 'graphql-ws';\nimport { isDevEnv } from './envHelpers.js';\n\nlet graphqlHttpEndpoint = '/api/graphql';\nlet graphqlWsEndpoint = '/api/ws';\n\n// (anonymousEnvironment reserved if needed later for public access / logout scenarios)\n// Removed until actually required to avoid lint errors.\n// let anonymousEnvironment: Environment | undefined;\nlet environment: Environment | undefined;\nlet wsClient: Client | undefined;\nlet getAuthHeaders:\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\nlet customDataIdResolver:\n | ((fieldValue: unknown, typeName: string) => string | null)\n | undefined;\n\nexport type RelayTransportStatus = 'idle' | 'configured' | 'reconnecting';\n\nexport interface RelayTransportSnapshot {\n generation: number;\n reason: string | null;\n status: RelayTransportStatus;\n}\n\nexport interface RelayReconnectOptions {\n reason?: string;\n}\n\ntype RelayTransportListener = () => void;\n\nlet relayTransportSnapshot: RelayTransportSnapshot = {\n generation: 0,\n reason: null,\n status: 'idle',\n};\nconst relayTransportListeners = new Set<RelayTransportListener>();\n\n/**\n * No-op Relay field logger used to satisfy @required(action: LOG).\n */\nfunction noopRelayFieldLogger(): void {}\n\nlet relayFieldLogger: RelayFieldLogger = noopRelayFieldLogger;\n\nif (isDevEnv()) {\n relayFieldLogger = (event) => {\n // eslint-disable-next-line no-console\n console.log('relayFieldLogger: ', event);\n };\n}\n\nconst defaultGetDataId: (\n fieldValue: unknown,\n typeName: string,\n) => string | null = (fieldValue) => {\n if (fieldValue == null || typeof fieldValue !== 'object') {\n return null;\n }\n const { id } = fieldValue as { id?: unknown };\n if (typeof id !== 'string' || id.trim() === '') {\n return null;\n }\n return id;\n};\n\nconst getDataId = (fieldValue: unknown, typeName: string): string | null => {\n const customId = customDataIdResolver?.(fieldValue, typeName);\n if (customId != null) {\n return customId;\n }\n return defaultGetDataId(fieldValue, typeName);\n};\n\n/**\n * Notify subscribers that the Relay transport state changed.\n */\nfunction emitRelayTransportChange(\n status: RelayTransportStatus,\n reason: string | null,\n): void {\n relayTransportSnapshot = {\n generation: relayTransportSnapshot.generation + 1,\n reason,\n status,\n };\n for (const listener of relayTransportListeners) {\n listener();\n }\n}\n\n/**\n * Dispose the active websocket client and ignore shutdown failures.\n */\nfunction disposeWsClient(): void {\n if (wsClient == null) {\n return;\n }\n try {\n const result = wsClient.dispose();\n if (result instanceof Promise) {\n result.catch(() => {\n // ignore dispose rejections\n });\n }\n } catch {\n // ignore errors during dispose\n }\n wsClient = undefined;\n}\n\n/**\n * Return the current Relay transport state used by subscription hooks.\n */\nexport function getRelayTransportSnapshot(): RelayTransportSnapshot {\n return relayTransportSnapshot;\n}\n\n/**\n * Subscribe to Relay transport changes.\n */\nexport function subscribeRelayTransport(\n listener: RelayTransportListener,\n): () => void {\n relayTransportListeners.add(listener);\n return () => {\n relayTransportListeners.delete(listener);\n };\n}\n\n/**\n * Force the websocket transport to reconnect and notify mounted subscriptions.\n */\nexport function reconnectRelayWebSocket(\n options: RelayReconnectOptions = {},\n): void {\n disposeWsClient();\n emitRelayTransportChange(\n 'reconnecting',\n options.reason ?? 'manual_reconnect',\n );\n}\n\nexport interface RelayEnvironmentConfiguration {\n httpUrl?: string;\n wsUrl?: string;\n logEvents?: boolean;\n getDataId?: (fieldValue: unknown, typeName: string) => string | null;\n getAuthHeaders?: () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n}\n\n/**\n * Configure the endpoints and logging behavior used by the shared Relay environment.\n */\nexport function configureRelayEnvironment(\n options: RelayEnvironmentConfiguration = {},\n): void {\n const {\n httpUrl,\n wsUrl,\n logEvents,\n getDataId: nextGetDataId,\n getAuthHeaders: nextGetAuthHeaders,\n } = options;\n\n if (typeof httpUrl === 'string' && httpUrl !== '') {\n graphqlHttpEndpoint = httpUrl;\n }\n\n if (typeof wsUrl === 'string' && wsUrl !== '') {\n graphqlWsEndpoint = wsUrl;\n }\n\n if (logEvents != null) {\n if (logEvents) {\n relayFieldLogger = (event) => {\n // eslint-disable-next-line no-console\n console.log('relayFieldLogger: ', event);\n };\n } else {\n relayFieldLogger = noopRelayFieldLogger;\n }\n }\n\n customDataIdResolver = nextGetDataId;\n getAuthHeaders = nextGetAuthHeaders;\n\n disposeWsClient();\n environment = undefined;\n emitRelayTransportChange('configured', 'configure');\n}\n\n/**\n * Resolve the websocket endpoint into an absolute URL suitable for graphql-ws.\n */\nfunction resolveWebsocketUrl(): string {\n const endpoint = graphqlWsEndpoint;\n\n if (endpoint.startsWith('ws')) {\n return endpoint;\n }\n\n if (endpoint.startsWith('http')) {\n return endpoint.replace(/^http/, 'ws');\n }\n\n if (endpoint.startsWith('/')) {\n if (typeof window === 'undefined') {\n return endpoint;\n }\n let protocol = 'ws:';\n if (window.location.protocol === 'https:') {\n protocol = 'wss:';\n }\n return `${protocol}//${window.location.host}${endpoint}`;\n }\n\n return endpoint;\n}\n\n/**\n * Build or get a singleton graphql-ws client with basic auto-reconnect.\n * The graphql-ws library already supports lazy connections and we add retry logic.\n */\nfunction getWsClient(): Client {\n if (wsClient != null) {\n return wsClient;\n }\n if (typeof window === 'undefined') {\n throw new Error(\n 'GraphQL subscriptions unavailable in non-browser environment',\n );\n }\n\n const url = resolveWebsocketUrl();\n\n // Exponential backoff parameters\n const maxAttempts = 10;\n const baseDelayMs = 500;\n\n wsClient = createClient({\n url,\n keepAlive: 10_000,\n lazy: true,\n retryAttempts: maxAttempts,\n shouldRetry() {\n return true;\n },\n async retryWait(retries) {\n // retries starts at 0\n const delay =\n Math.min(8000, baseDelayMs * 2 ** retries) + Math.random() * 200;\n await new Promise<void>((resolve) => {\n setTimeout(() => {\n resolve();\n }, delay);\n });\n },\n connectionParams: async () => {\n if (getAuthHeaders == null) {\n return {};\n }\n try {\n return await getAuthHeaders();\n } catch {\n return {};\n }\n },\n });\n\n return wsClient;\n}\n\n/**\n * Get organization slug from current window location\n */\n// export function getOrganizationSlug(): string | null {\n// const { pathname } = window.location;\n// const slug = pathname.split('/')[1];\n// if (slug == null) {\n// return null;\n// }\n\n// return slug;\n// }\n\n// -------------------------\n// Upload detection helpers\n// -------------------------\n/** Test if a value is an uploadable (File/Blob) */\nfunction isUploadable(value: unknown): value is File | Blob {\n return (\n (typeof File !== 'undefined' && value instanceof File) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n );\n}\n\ninterface FileRef {\n path: string; // JSON pointer-like (e.g. variables.input.file)\n file: File | Blob;\n}\n\n/** Recursively clone a structure replacing files with null and collecting them */\nfunction collectFiles(value: unknown, path: string, acc: FileRef[]): unknown {\n if (isUploadable(value)) {\n acc.push({ path, file: value });\n return null; // placeholder per multipart spec\n }\n if (Array.isArray(value)) {\n return value.map((v, i) => {\n return collectFiles(v, `${path}.${i}`, acc);\n });\n }\n if (value != null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = collectFiles(v, `${path}.${k}`, acc);\n }\n return out;\n }\n return value; // primitives unchanged\n}\n\n/** Build GraphQL multipart form-data payload */\nfunction buildFormData(\n query: string,\n variables: Record<string, unknown>,\n): FormData {\n const files: FileRef[] = [];\n // Deep clone variables while replacing files with null\n const clonedVars = collectFiles(variables, 'variables', files) as Record<\n string,\n unknown\n >;\n\n const form = new FormData();\n const operations = { query, variables: clonedVars };\n form.append('operations', JSON.stringify(operations));\n\n const map: Record<string, string[]> = {};\n files.forEach((ref, idx) => {\n map[idx] = [ref.path];\n });\n form.append('map', JSON.stringify(map));\n files.forEach((ref, idx) => {\n form.append(String(idx), ref.file);\n });\n return form;\n}\n\n// -------------------------\n// Retry / timeout helpers\n// -------------------------\ninterface RetryOptions {\n maxAttempts: number; // total attempts including initial\n baseDelayMs: number;\n maxDelayMs: number;\n fetchTimeoutMs: number;\n}\n\nconst RETRY_OPTIONS: RetryOptions = {\n maxAttempts: 3,\n baseDelayMs: 300,\n maxDelayMs: 4000,\n fetchTimeoutMs: 600_000, // 10 minutes (parité avec ancien middleware)\n};\n\n/** Sleep helper with Promise */\nasync function sleep(ms: number): Promise<void> {\n await new Promise<void>((res) => {\n setTimeout(() => {\n res();\n }, ms);\n });\n}\n\n/** Exponential backoff with jitter */\nfunction calcBackoff(attempt: number, opts: RetryOptions): number {\n const exp = Math.min(opts.maxDelayMs, opts.baseDelayMs * 2 ** attempt);\n return exp + Math.random() * 0.2 * exp; // jitter 0-20%\n}\n\n/** Determine if an HTTP status is retryable */\nfunction isRetryableStatus(status: number): boolean {\n return status === 408 || status === 429 || (status >= 500 && status < 600);\n}\n\n/** Determine if an error should be treated as transient network issue */\nfunction isNetworkError(err: unknown): boolean {\n return (\n err instanceof TypeError ||\n (err instanceof Error && err.name === 'AbortError')\n );\n}\n\n// -------------------------\n// fetchFn implementation\n// -------------------------\ninterface GraphQLResponseErrorItem {\n [key: string]: unknown;\n message: string;\n}\n\ninterface GraphQLResponseShape<T = unknown> {\n data?: T;\n errors?: GraphQLResponseErrorItem[];\n extensions?: Record<string, unknown>;\n}\n\n/** Debug log helper (no-op en production) */\nfunction debugLog(...args: unknown[]): void {\n if (isDevEnv()) {\n // eslint-disable-next-line no-console\n console.log('[RelayNetwork]', ...args);\n }\n}\n\n/** Fetch GraphQL (with retry + upload) */\nasync function fetchFn(\n request: { text: string | null | undefined },\n variables: Record<string, unknown>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _cacheConfig: unknown,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _uploadables: unknown,\n): Promise<GraphQLResponseShape> {\n const queryText: string | null | undefined = request.text; // no persisted queries here (yet)\n if (queryText == null) {\n throw new Error('Missing GraphQL query text');\n }\n const safeQueryText: string = queryText; // narrowed non-null\n\n /** Execute one network attempt */\n async function execOnce(attempt: number): Promise<GraphQLResponseShape> {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, RETRY_OPTIONS.fetchTimeoutMs);\n try {\n let body: BodyInit;\n const headers: Record<string, string> = {};\n if (getAuthHeaders != null) {\n try {\n Object.assign(headers, await getAuthHeaders());\n } catch {\n // ignore auth header failures\n }\n }\n const hasFiles = ((): boolean => {\n try {\n const stack: unknown[] = [variables];\n while (stack.length > 0) {\n const v = stack.pop();\n if (isUploadable(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n stack.push(...v);\n } else if (v != null && typeof v === 'object') {\n stack.push(...Object.values(v as Record<string, unknown>));\n }\n }\n } catch {\n // ignore traversal errors\n }\n return false;\n })();\n\n if (hasFiles) {\n body = buildFormData(safeQueryText, variables);\n } else {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify({ query: safeQueryText, variables });\n }\n\n const response = await fetch(graphqlHttpEndpoint, {\n method: 'POST',\n body,\n headers,\n credentials: 'include',\n signal: controller.signal,\n });\n\n if (!response.ok) {\n if (\n attempt < RETRY_OPTIONS.maxAttempts - 1 &&\n isRetryableStatus(response.status)\n ) {\n throw new Error(`Retryable HTTP status ${response.status}`);\n }\n const text = await response.text().catch(() => {\n return '';\n });\n throw new Error(`GraphQL HTTP error ${response.status}: ${text}`);\n }\n\n const json: GraphQLResponseShape = await response.json();\n if (Array.isArray(json.errors) && json.errors.length > 0) {\n debugLog('GraphQL errors', json.errors);\n }\n return json;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n for (let attempt = 0; attempt < RETRY_OPTIONS.maxAttempts; attempt += 1) {\n try {\n return await execOnce(attempt);\n } catch (err) {\n const last = attempt === RETRY_OPTIONS.maxAttempts - 1;\n const retryable =\n isNetworkError(err) ||\n (err instanceof Error && err.message.includes('Retryable HTTP status'));\n if (!retryable || last) {\n debugLog('GraphQL fetch error', err);\n throw err;\n }\n const delay = calcBackoff(attempt, RETRY_OPTIONS);\n await sleep(delay);\n }\n }\n throw new Error('Exhausted retries without returning a result');\n}\n\n// -------------------------\n// subscribeFn implementation (wrap existing logic in Relay Observable)\n// -------------------------\n/** Subscription function bridging graphql-ws client to Relay */\nfunction subscribeFn(\n operation: { text: string | null | undefined; name: string },\n variables: Record<string, unknown>,\n): Observable<unknown> {\n debugLog('subscription:start', operation.name, variables);\n return Observable.create<unknown>((sink) => {\n const query = operation.text;\n if (query == null || query === '') {\n sink.error(new Error('Subscription operation text is empty'));\n return () => {\n // noop\n };\n }\n const client = getWsClient();\n const dispose = client.subscribe(\n { query, variables, operationName: operation.name },\n {\n next: (data) => {\n sink.next(data);\n },\n error: (err) => {\n let errorObj: Error;\n if (err instanceof Error) {\n errorObj = err;\n } else {\n errorObj = new Error('Subscription error');\n }\n sink.error(errorObj);\n },\n complete: () => {\n sink.complete();\n },\n },\n );\n return () => {\n dispose();\n };\n });\n}\n\n/**\n * Create native Relay network layer (fetch + subscribe)\n */\nexport function getNetwork(): ReturnType<typeof Network.create> {\n return Network.create(\n fetchFn as FetchFunction,\n subscribeFn as SubscribeFunction,\n );\n}\n\n/**\n * Get anonymous relay environment\n */\nexport function getEnvironment(): Environment {\n environment ??= new Environment({\n getDataID: getDataId,\n relayFieldLogger,\n network: getNetwork(),\n store: new Store(new RecordSource()),\n });\n\n return environment;\n}\n\n/**\n * Reset the Relay store by creating a new empty source\n */\nexport function resetRelayStore(): void {\n const environment = getEnvironment();\n\n // Create a new store with an empty source\n const source = new RecordSource();\n\n // Replace the data in the store with our empty source\n environment.getStore().publish(source);\n\n // Notify subscribers that the data has changed\n environment.getStore().notify();\n}\n\nexport const __test = {\n buildFormData,\n calcBackoff,\n collectFiles,\n getDataId,\n isNetworkError,\n isRetryableStatus,\n isUploadable,\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mutationResult.js","names":[],"sources":["../../../src/relay/mutationResult.ts"],"sourcesContent":["export type MutationResult = 'SUCCESS' | 'ERROR';\n\nexport type MutationPayloadBase<Reason extends string = string> = {\n status?: MutationResult | null;\n result?: MutationResult | null;\n errorReason?: Reason | null;\n};\n\nexport type MutationOutcome<Payload, Reason extends string = string> =\n | { ok: true; payload: Payload }\n | { ok: false; reason?: Reason | null; message: string };\n\nexport type ResolveOptions<Reason extends string> = {\n defaultErrorMessage: string;\n mapReason?: (reason: Reason) => string | null;\n missingPayloadMessage?: string;\n};\n\nexport const getStatus = (\n payload: MutationPayloadBase | null | undefined,\n): MutationResult | null => {\n return payload?.status ?? payload?.result ?? null;\n};\n\nexport const resolveMutationOutcome = <\n Payload extends MutationPayloadBase<Reason>,\n Reason extends string,\n>(\n payload: Payload | null | undefined,\n options: ResolveOptions<Reason>,\n): MutationOutcome<Payload, Reason> => {\n const { defaultErrorMessage, mapReason, missingPayloadMessage } = options;\n\n if (payload == null) {\n return {\n ok: false,\n message: missingPayloadMessage ?? defaultErrorMessage,\n };\n }\n\n const status = getStatus(payload);\n if (status !== 'SUCCESS') {\n const reason = payload.errorReason ?? null;\n let mapped: string | null = null;\n if (reason != null && mapReason != null) {\n mapped = mapReason(reason);\n }\n return {\n ok: false,\n reason,\n message: mapped ?? defaultErrorMessage,\n };\n }\n\n return { ok: true, payload };\n};\n\nexport const requireField = <T>(\n value: T | null | undefined,\n message: string,\n): { ok: true; value: T } | { ok: false; message: string } => {\n if (value == null) {\n return { ok: false, message };\n }\n\n return { ok: true, value };\n};\n\ntype RecordWithId = {\n id?: string | null;\n};\n\nexport const requireLinkedRecordId = (\n record: RecordWithId | null | undefined,\n message: string,\n): { ok: true; id: string } | { ok: false; message: string } => {\n const result = requireField(record?.id ?? null, message);\n if (!result.ok) {\n return result;\n }\n\n return { ok: true, id: result.value };\n};\n\nexport type AgentStartPayload<\n Reason extends string,\n Status extends string,\n> = MutationPayloadBase<Reason> & {\n agentStatus?: Status | null;\n};\n\nexport const resolveAgentStartOutcome = <\n Reason extends string,\n Status extends string,\n>(\n payload: AgentStartPayload<Reason, Status> | null | undefined,\n options: ResolveOptions<Reason>,\n):\n | { ok: true; agentStatus: Status }\n | { ok: false; message: string; reason?: Reason | null } => {\n const base = resolveMutationOutcome(payload, options);\n if (!base.ok) {\n return base;\n }\n\n const agentStatusResult = requireField(\n base.payload.agentStatus ?? null,\n options.defaultErrorMessage,\n );\n\n if (!agentStatusResult.ok) {\n return { ok: false, message: agentStatusResult.message };\n }\n\n return { ok: true, agentStatus: agentStatusResult.value };\n};\n"],"mappings":";AAkBA,IAAa,KACX,MAEO,GAAS,UAAU,GAAS,UAAU,MAGlC,KAIX,GACA,MACqC;CACrC,IAAM,EAAE,wBAAqB,cAAW,6BAA0B;CAElE,IAAI,KAAW,MACb,OAAO;EACL,IAAI;EACJ,SAAS,KAAyB;EACnC;CAIH,IADe,EAAU,EACrB,KAAW,WAAW;EACxB,IAAM,IAAS,EAAQ,eAAe,MAClC,IAAwB;EAI5B,OAHI,KAAU,QAAQ,KAAa,SACjC,IAAS,EAAU,EAAO,GAErB;GACL,IAAI;GACJ;GACA,SAAS,KAAU;GACpB;;CAGH,OAAO;EAAE,IAAI;EAAM;EAAS;GAGjB,KACX,GACA,MAEI,KAAS,OACJ;CAAE,IAAI;CAAO;CAAS,GAGxB;CAAE,IAAI;CAAM;CAAO,EAOf,KACX,GACA,MAC8D;CAC9D,IAAM,IAAS,EAAa,GAAQ,MAAM,MAAM,EAAQ;CAKxD,OAJK,EAAO,KAIL;EAAE,IAAI;EAAM,IAAI,EAAO;EAAO,GAH5B;GAaE,KAIX,GACA,MAG4D;CAC5D,IAAM,IAAO,EAAuB,GAAS,EAAQ;CACrD,IAAI,CAAC,EAAK,IACR,OAAO;CAGT,IAAM,IAAoB,EACxB,EAAK,QAAQ,eAAe,MAC5B,EAAQ,oBACT;CAMD,OAJK,EAAkB,KAIhB;EAAE,IAAI;EAAM,aAAa,EAAkB;EAAO,GAHhD;EAAE,IAAI;EAAO,SAAS,EAAkB;EAAS"}
1
+ {"version":3,"file":"mutationResult.js","names":[],"sources":["../../../src/relay/mutationResult.ts"],"sourcesContent":["export type MutationResult = 'SUCCESS' | 'ERROR';\n\nexport type MutationPayloadBase<Reason extends string = string> = {\n status?: MutationResult | null;\n result?: MutationResult | null;\n errorReason?: Reason | null;\n};\n\nexport type MutationOutcome<Payload, Reason extends string = string> =\n | { ok: true; payload: Payload }\n | { ok: false; reason?: Reason | null; message: string };\n\nexport type ResolveOptions<Reason extends string> = {\n defaultErrorMessage: string;\n mapReason?: (reason: Reason) => string | null;\n missingPayloadMessage?: string;\n};\n\nexport const getStatus = (\n payload: MutationPayloadBase | null | undefined,\n): MutationResult | null => {\n return payload?.status ?? payload?.result ?? null;\n};\n\nexport const resolveMutationOutcome = <\n Payload extends MutationPayloadBase<Reason>,\n Reason extends string,\n>(\n payload: Payload | null | undefined,\n options: ResolveOptions<Reason>,\n): MutationOutcome<Payload, Reason> => {\n const { defaultErrorMessage, mapReason, missingPayloadMessage } = options;\n\n if (payload == null) {\n return {\n ok: false,\n message: missingPayloadMessage ?? defaultErrorMessage,\n };\n }\n\n const status = getStatus(payload);\n if (status !== 'SUCCESS') {\n const reason = payload.errorReason ?? null;\n let mapped: string | null = null;\n if (reason != null && mapReason != null) {\n mapped = mapReason(reason);\n }\n return {\n ok: false,\n reason,\n message: mapped ?? defaultErrorMessage,\n };\n }\n\n return { ok: true, payload };\n};\n\nexport const requireField = <T>(\n value: T | null | undefined,\n message: string,\n): { ok: true; value: T } | { ok: false; message: string } => {\n if (value == null) {\n return { ok: false, message };\n }\n\n return { ok: true, value };\n};\n\ntype RecordWithId = {\n id?: string | null;\n};\n\nexport const requireLinkedRecordId = (\n record: RecordWithId | null | undefined,\n message: string,\n): { ok: true; id: string } | { ok: false; message: string } => {\n const result = requireField(record?.id ?? null, message);\n if (!result.ok) {\n return result;\n }\n\n return { ok: true, id: result.value };\n};\n\nexport type AgentStartPayload<\n Reason extends string,\n Status extends string,\n> = MutationPayloadBase<Reason> & {\n agentStatus?: Status | null;\n};\n\nexport const resolveAgentStartOutcome = <\n Reason extends string,\n Status extends string,\n>(\n payload: AgentStartPayload<Reason, Status> | null | undefined,\n options: ResolveOptions<Reason>,\n):\n | { ok: true; agentStatus: Status }\n | { ok: false; message: string; reason?: Reason | null } => {\n const base = resolveMutationOutcome(payload, options);\n if (!base.ok) {\n return base;\n }\n\n const agentStatusResult = requireField(\n base.payload.agentStatus ?? null,\n options.defaultErrorMessage,\n );\n\n if (!agentStatusResult.ok) {\n return { ok: false, message: agentStatusResult.message };\n }\n\n return { ok: true, agentStatus: agentStatusResult.value };\n};\n"],"mappings":";AAkBA,IAAa,KACX,MAEO,GAAS,UAAU,GAAS,UAAU,MAGlC,KAIX,GACA,MACqC;CACrC,IAAM,EAAE,wBAAqB,cAAW,6BAA0B;CAElE,IAAI,KAAW,MACb,OAAO;EACL,IAAI;EACJ,SAAS,KAAyB;CACpC;CAIF,IADe,EAAU,CACrB,MAAW,WAAW;EACxB,IAAM,IAAS,EAAQ,eAAe,MAClC,IAAwB;EAI5B,OAHI,KAAU,QAAQ,KAAa,SACjC,IAAS,EAAU,CAAM,IAEpB;GACL,IAAI;GACJ;GACA,SAAS,KAAU;EACrB;CACF;CAEA,OAAO;EAAE,IAAI;EAAM;CAAQ;AAC7B,GAEa,KACX,GACA,MAEI,KAAS,OACJ;CAAE,IAAI;CAAO;AAAQ,IAGvB;CAAE,IAAI;CAAM;AAAM,GAOd,KACX,GACA,MAC8D;CAC9D,IAAM,IAAS,EAAa,GAAQ,MAAM,MAAM,CAAO;CAKvD,OAJK,EAAO,KAIL;EAAE,IAAI;EAAM,IAAI,EAAO;CAAM,IAH3B;AAIX,GASa,KAIX,GACA,MAG4D;CAC5D,IAAM,IAAO,EAAuB,GAAS,CAAO;CACpD,IAAI,CAAC,EAAK,IACR,OAAO;CAGT,IAAM,IAAoB,EACxB,EAAK,QAAQ,eAAe,MAC5B,EAAQ,mBACV;CAMA,OAJK,EAAkB,KAIhB;EAAE,IAAI;EAAM,aAAa,EAAkB;CAAM,IAH/C;EAAE,IAAI;EAAO,SAAS,EAAkB;CAAQ;AAI3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeAuthPaths.js","names":[],"sources":["../../../src/router/backofficeAuthPaths.ts"],"sourcesContent":["const normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n let withLeadingSlash = value;\n if (!value.startsWith('/')) {\n withLeadingSlash = `/${value}`;\n }\n if (withLeadingSlash.endsWith('/')) {\n return withLeadingSlash.slice(0, -1);\n }\n return withLeadingSlash;\n};\n\nconst prefixBackofficePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nexport const getBackofficeLoginPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login');\n};\n\nexport const getBackofficePasswordResetPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login/reset');\n};\n"],"mappings":";AAAA,IAAM,KAAyB,MAA0B;CACvD,IAAI,EAAM,MAAM,KAAK,MAAM,MAAU,KACnC,OAAO;CAET,IAAI,IAAmB;CAOvB,OANK,EAAM,WAAW,IAAI,KACxB,IAAmB,IAAI,MAErB,EAAiB,SAAS,IAAI,GACzB,EAAiB,MAAM,GAAG,GAAG,GAE/B;GAGH,KAAwB,GAAkB,MAA0B;CACxE,IAAM,IAAiB,EAAsB,EAAM,EAC7C,IAAqB,EAAsB,EAAS;CAc1D,OAZI,MAAuB,OAIzB,MAAmB,KACnB,EAAe,WAAW,GAAG,EAAmB,GAAG,GAE5C,IAEL,MAAmB,MACd,IAEF,GAAG,IAAqB;GAGpB,KAA0B,MAC9B,EAAqB,GAAU,SAAS,EAGpC,KAAkC,MACtC,EAAqB,GAAU,eAAe"}
1
+ {"version":3,"file":"backofficeAuthPaths.js","names":[],"sources":["../../../src/router/backofficeAuthPaths.ts"],"sourcesContent":["const normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n let withLeadingSlash = value;\n if (!value.startsWith('/')) {\n withLeadingSlash = `/${value}`;\n }\n if (withLeadingSlash.endsWith('/')) {\n return withLeadingSlash.slice(0, -1);\n }\n return withLeadingSlash;\n};\n\nconst prefixBackofficePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nexport const getBackofficeLoginPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login');\n};\n\nexport const getBackofficePasswordResetPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login/reset');\n};\n"],"mappings":";AAAA,IAAM,KAAyB,MAA0B;CACvD,IAAI,EAAM,KAAK,MAAM,MAAM,MAAU,KACnC,OAAO;CAET,IAAI,IAAmB;CAOvB,OANK,EAAM,WAAW,GAAG,MACvB,IAAmB,IAAI,MAErB,EAAiB,SAAS,GAAG,IACxB,EAAiB,MAAM,GAAG,EAAE,IAE9B;AACT,GAEM,KAAwB,GAAkB,MAA0B;CACxE,IAAM,IAAiB,EAAsB,CAAK,GAC5C,IAAqB,EAAsB,CAAQ;CAczD,OAZI,MAAuB,OAIzB,MAAmB,KACnB,EAAe,WAAW,GAAG,EAAmB,EAAE,IAE3C,IAEL,MAAmB,MACd,IAEF,GAAG,IAAqB;AACjC,GAEa,KAA0B,MAC9B,EAAqB,GAAU,QAAQ,GAGnC,KAAkC,MACtC,EAAqB,GAAU,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"createBackofficeRoutes.js","names":[],"sources":["../../../src/router/createBackofficeRoutes.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useContext,\n useEffect,\n type ComponentType,\n type JSX,\n type ReactNode,\n} from 'react';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport {\n getResourcePage,\n type ResourcePage,\n} from '@plumile/router/ResourcePage.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport { r } from '@plumile/router/tools.js';\nimport { type AnyRoute, type Route } from '@plumile/router/types.js';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type {\n Environment,\n GraphQLTaggedNode,\n OperationType,\n} from 'relay-runtime';\n\nimport { BACKOFFICE_LIST_DEFAULTS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeDashboardConfig,\n BackofficeEntityManifestMap,\n BackofficePreparedDetailLayoutRoute,\n BackofficePreparedDetailPageRoute,\n BackofficePreparedListRoute,\n BackofficePreparedToolRoute,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardRegistration,\n BackofficeDashboardModule,\n BackofficeResolvedSidebarHubConfig,\n BackofficeSidebarConfig,\n} from '../provider/types.js';\nimport {\n buildEntityGroupLookup,\n resolveSidebarHubEntries,\n resolveSidebarGroups,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport type { BackofficeEntityRegistry } from '../provider/entityRegistry.js';\nimport { validateBackofficeDashboardRegistrations } from '../provider/dashboardRegistrations.js';\n\nconst { loadQuery, usePreloadedQuery } = ReactRelay;\n\nexport type CreateBackofficeRoutesInput = {\n basePath: string;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n sidebar?: BackofficeSidebarConfig;\n auth: BackofficeAuthConfig;\n dashboard?: BackofficeDashboardModule;\n dashboards?: readonly BackofficeDashboardRegistration[];\n toolsOperationPage?: ResourcePage | null;\n};\n\nexport type BackofficeRouterContext = {\n relayEnvironment: Environment;\n};\n\nexport const WrapperPageResource: ResourcePage | null = getResourcePage(\n 'WrapperPage',\n // eslint-disable-next-line arrow-body-style\n async () => ({\n default: (await import('@plumile/ui/pages/WrapperPage.js')).WrapperPage,\n }),\n);\n\nexport const BackofficeLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLayoutPage.js'),\n );\n\nexport const BackofficeEntityListPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityListPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityListPage.js'),\n );\n\nexport const BackofficeEntityDetailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailPage.js'),\n );\n\nexport const BackofficeEntityDetailLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailLayoutPage.js'),\n );\n\nexport const BackofficeEntityDetailUnknownPageRedirectResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailUnknownPageRedirect',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailUnknownPageRedirect.js'),\n );\n\nexport const BackofficeDashboardPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeDashboardPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeDashboardPage.js'),\n );\n\nexport const BackofficeHubPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeHubPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeHubPage.js'),\n);\n\nexport const BackofficeLoginPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeLoginPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLoginPage.js'),\n);\n\nexport const BackofficePasswordResetRequestPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetRequestPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetRequestPage.js'),\n );\n\nexport const BackofficePasswordResetCompletePageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetCompletePage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetCompletePage.js'),\n );\n\nexport const BackofficeVerifyEmailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeVerifyEmailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeVerifyEmailPage.js'),\n );\n\nexport const BackofficeAcceptInvitationPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeAcceptInvitationPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeAcceptInvitationPage.js'),\n );\n\ntype PreparedDetailUnknownPage = {\n id: string;\n pagePath: string;\n entityManifest: BackofficeEntityManifestMap[string];\n entityConfig: BackofficeResolvedDetailLayoutFacetConfigBase;\n};\n\ntype PreparedLayout = {\n permissionsQuery: PreloadedQuery<OperationType> | null;\n authStatusQuery: PreloadedQuery<OperationType> | null;\n};\n\nexport type BackofficePreparedDashboardRoute = {\n dashboardId: string;\n config: BackofficeDashboardConfig;\n};\n\ntype LayoutAuthStatus = {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n} | null;\n\ntype LayoutRouteComponent = ComponentType<{\n children: ReactNode;\n permissionsQuery?: GraphQLTaggedNode;\n prepared?: PreloadedQuery<OperationType> | null;\n authStatus?: LayoutAuthStatus;\n activeGroupId?: string | null;\n}>;\n\ntype LayoutRouteRenderProps = {\n children: ReactNode;\n Component: LayoutRouteComponent;\n preparedLayout: PreparedLayout | undefined;\n permissionsQuery: GraphQLTaggedNode | undefined;\n activeGroupId: string | null;\n};\n\nconst BackofficeLoginRedirect = ({\n loginRedirectPath,\n}: {\n loginRedirectPath: string;\n}): null => {\n const router = useContext(RoutingContext);\n\n useEffect(() => {\n router?.history.set({\n pathname: loginRedirectPath,\n });\n }, [loginRedirectPath, router]);\n\n return null;\n};\n\nconst BackofficeLayoutRouteWithoutAuthStatus = ({\n children,\n Component,\n preparedLayout,\n permissionsQuery,\n activeGroupId,\n}: LayoutRouteRenderProps): JSX.Element => {\n return (\n <Component\n permissionsQuery={permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={null}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n};\n\nconst BackofficeLayoutRouteWithAuthStatus = ({\n children,\n Component,\n preparedLayout,\n permissionsQuery,\n activeGroupId,\n authStatusQuery,\n authStatusPrepared,\n loginRedirectPath,\n}: LayoutRouteRenderProps & {\n authStatusQuery: GraphQLTaggedNode;\n authStatusPrepared: PreloadedQuery<OperationType>;\n loginRedirectPath: string;\n}): JSX.Element => {\n const data = usePreloadedQuery(authStatusQuery, authStatusPrepared);\n const authStatus = data as LayoutAuthStatus;\n\n if (authStatus?.isLoggedIn !== true) {\n return <BackofficeLoginRedirect loginRedirectPath={loginRedirectPath} />;\n }\n\n return (\n <Component\n permissionsQuery={permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n};\n\nexport type BackofficePreparedHubRoute = {\n hubId: string;\n hub: BackofficeResolvedSidebarHubConfig;\n};\n\nconst normalizeBaseSegment = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '/') {\n return '';\n }\n return trimmed.replace(/^\\/+|\\/+$/g, '');\n};\n\nconst normalizePath = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '') {\n return '/';\n }\n return `/${trimmed}`.replace(/\\/+/g, '/');\n};\n\nconst buildScopedPath = (baseSegment: string, path: string): string => {\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n if (baseSegment === '') {\n return normalizedPath;\n }\n if (normalizedPath === '') {\n return baseSegment;\n }\n return `${baseSegment}/${normalizedPath}`;\n};\n\nconst buildScopedAbsolutePath = (baseSegment: string, path: string): string => {\n return normalizePath(buildScopedPath(baseSegment, path));\n};\n\nconst buildRelativePath = (\n absolutePath: string,\n baseSegment: string,\n): string => {\n const normalized = normalizePath(absolutePath);\n const basePrefix = baseSegment === '' ? '' : `/${baseSegment}`;\n if (basePrefix !== '' && normalized.startsWith(basePrefix)) {\n return normalized.slice(basePrefix.length).replace(/^\\/+/, '');\n }\n return normalized.replace(/^\\/+/, '');\n};\n\nconst resolveActiveEntityIdFromRoute = (\n route: { routes: AnyRoute[] } | null,\n routeEntityIdMap: WeakMap<AnyRoute, string>,\n): string | null => {\n if (route?.routes == null) {\n return null;\n }\n for (let index = route.routes.length - 1; index >= 0; index -= 1) {\n const routeEntry = route.routes[index];\n if (routeEntry != null) {\n const entityId = routeEntityIdMap.get(routeEntry);\n if (entityId != null) {\n return entityId;\n }\n }\n }\n return null;\n};\n\nconst toSearchParams = (query: Record<string, unknown>): URLSearchParams => {\n const params = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value == null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n if (entry == null) {\n return;\n }\n params.append(key, String(entry));\n });\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n params.set(key, String(value));\n });\n return params;\n};\n\nconst rBackoffice = r<BackofficeRouterContext>;\n\n/**\n * Creates backoffice routes based on the provided configuration\n */\nexport function createBackofficeRoutes(\n input: CreateBackofficeRoutesInput,\n): Route<BackofficeRouterContext, any>[] {\n const { basePath, entityManifest, entityRegistry, sidebar, auth, dashboard } =\n input;\n const dashboards = validateBackofficeDashboardRegistrations(input.dashboards);\n const baseSegment = normalizeBaseSegment(basePath);\n const loginPath = buildScopedPath(baseSegment, 'login');\n const passwordResetRequestPath = buildScopedPath(baseSegment, 'login/reset');\n const passwordResetCompletePath = buildScopedPath(\n baseSegment,\n 'login/reset/complete',\n );\n const verifyEmailPath = buildScopedPath(baseSegment, 'verify-email');\n const acceptInvitationPath = buildScopedPath(\n baseSegment,\n 'accept-invitation',\n );\n const loginRedirectPath = buildScopedAbsolutePath(baseSegment, 'login');\n const entities = entityManifest;\n const groups = resolveSidebarGroups(entities, sidebar);\n const hubEntries = resolveSidebarHubEntries(groups, sidebar);\n const entityGroupLookup = buildEntityGroupLookup(groups, sidebar);\n const entityIdToGroupId = new Map<string, string>();\n entityGroupLookup.forEach((value, entityId) => {\n entityIdToGroupId.set(entityId, value.groupId);\n });\n const routeEntityIdMap = new WeakMap<AnyRoute, string>();\n const routeGroupIdMap = new WeakMap<AnyRoute, string>();\n\n const permissionsQuery = sidebar?.permissionsQuery;\n const layoutPrepare = async ({\n context,\n }: {\n context: BackofficeRouterContext;\n }) => {\n const sessionAuth = await auth.session.load();\n const permissionsQueryRef =\n permissionsQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n permissionsQuery,\n {},\n )\n : null;\n const authStatusQueryRef =\n sessionAuth.authStatusQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n sessionAuth.authStatusQuery,\n {},\n { fetchPolicy: 'network-only' },\n )\n : null;\n return {\n permissionsQuery: permissionsQueryRef,\n authStatusQuery: authStatusQueryRef,\n };\n };\n\n const prepareRootDashboard =\n async (): Promise<BackofficePreparedDashboardRoute | null> => {\n if (dashboard == null) {\n return null;\n }\n const config = await dashboard.load();\n return {\n dashboardId: 'dashboard',\n config,\n };\n };\n const renderDashboard = ({\n prepared,\n Component,\n }: {\n prepared: unknown;\n Component?: ComponentType<Record<string, unknown>> | null;\n }): JSX.Element | null => {\n if (Component == null) {\n return null;\n }\n const DashboardComponent = Component as ComponentType<{\n prepared?: unknown;\n }>;\n return <DashboardComponent prepared={prepared} />;\n };\n\n const dashboardRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeDashboardPageResource,\n prepare: prepareRootDashboard,\n render: renderDashboard,\n });\n const dashboardAliasRoute = rBackoffice({\n path: 'dashboard',\n resourcePage: BackofficeDashboardPageResource,\n prepare: prepareRootDashboard,\n render: renderDashboard,\n });\n const secondaryDashboardRoutes = dashboards.map((registration) => {\n return rBackoffice({\n path: `dashboard/${registration.id}`,\n resourcePage: BackofficeDashboardPageResource,\n prepare: async () => {\n const config = await registration.module.load();\n return {\n dashboardId: registration.id,\n config,\n } satisfies BackofficePreparedDashboardRoute;\n },\n render: renderDashboard,\n });\n });\n\n const listEntityEntries = Object.values(entityManifest).filter((entity) => {\n return entity.kind === 'list-detail';\n });\n\n const hubRoutes = hubEntries.map((entry) => {\n const hubRelative = buildRelativePath(entry.hub.href, baseSegment);\n const hubRoute = rBackoffice({\n path: hubRelative,\n resourcePage: BackofficeHubPageResource,\n prepare: () => {\n return {\n hubId: entry.hub.id,\n hub: entry.hub,\n } satisfies BackofficePreparedHubRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component prepared={prepared} />;\n },\n });\n if (entry.groupId != null) {\n routeGroupIdMap.set(hubRoute, entry.groupId);\n }\n return hubRoute;\n });\n\n const entityRoutes = listEntityEntries.map((entityManifestItem) => {\n const listPath = entityManifestItem.routes.list;\n const listRelative = buildRelativePath(listPath, baseSegment);\n const children: Route<any, any>[] = [];\n\n if (entityManifestItem.hasList) {\n const listRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeEntityListPageResource,\n prepareSearchBehavior: 'path',\n prepare: async ({ context, query }) => {\n const entityModule = await entityRegistry.loadListEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const { list, listUrlCodec, listDefaults } = config;\n if (listUrlCodec == null || listDefaults == null) {\n throw new Error(\n `Backoffice entity ${entityManifestItem.id} does not expose a list configuration.`,\n );\n }\n const params = toSearchParams(query);\n const state = listUrlCodec.parse(params);\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables = list.buildQueryVariables(variablesBase);\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n list.query,\n variables,\n );\n const prepared: BackofficePreparedListRoute = {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n query: queryRef,\n };\n return prepared;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedListRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n routeEntityIdMap.set(listRoute, entityManifestItem.id);\n children.push(listRoute);\n }\n\n const detailLayoutRoute = rBackoffice({\n path: ':id',\n resourcePage: BackofficeEntityDetailLayoutPageResource,\n prepare: async ({ context, variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const rawId = String(variables.id ?? '');\n const layoutBuildResult =\n config.layoutPage.buildVariables != null\n ? config.layoutPage.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const layoutQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n config.layoutPage.query,\n layoutBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n layoutQuery: layoutQueryRef,\n id: rawId,\n } satisfies BackofficePreparedDetailLayoutRoute;\n },\n render: ({ children: detailChildren, prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedDetailLayoutRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n >\n {detailChildren}\n </Component>\n );\n },\n children: [\n rBackoffice({\n path: '',\n resourcePage: WrapperPageResource,\n prepare: ({ variables }) => {\n const rawId = String(variables.id ?? '').trim();\n return {\n redirectTo:\n rawId === ''\n ? null\n : entityManifestItem.routes.detailPage(\n rawId,\n entityManifestItem.defaultDetailPageId ?? 'overview',\n ),\n };\n },\n render: ({ prepared }) => {\n const redirectTo =\n (prepared as { redirectTo?: string | null }).redirectTo ?? null;\n if (redirectTo == null) {\n return null;\n }\n throw new HttpRedirect(redirectTo);\n },\n }),\n ...(entityManifestItem.detailPages ?? []).map((pageManifest) => {\n return rBackoffice({\n path: pageManifest.pathSegment,\n resourcePage: BackofficeEntityDetailPageResource,\n prepare: async ({ context, variables }) => {\n const rawId = String(variables.id ?? '');\n const pageModule = await entityRegistry.loadDetailPageEntity(\n entityManifestItem.id,\n pageManifest.id,\n );\n const pageBuildResult =\n pageModule.config.page.buildVariables != null\n ? pageModule.config.page.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const pageQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n pageModule.config.page.query,\n pageBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig:\n pageModule.config as unknown as BackofficeResolvedDetailLayoutFacetConfigBase,\n detailId: pageBuildResult.detailId,\n id: rawId,\n pageConfig: pageModule.config,\n pageQuery: pageQueryRef,\n pageId: pageManifest.id,\n pagePath: pageManifest.pathSegment,\n } satisfies BackofficePreparedDetailPageRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute =\n prepared as BackofficePreparedDetailPageRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n }),\n rBackoffice({\n path: ':pagePath',\n resourcePage: BackofficeEntityDetailUnknownPageRedirectResource,\n prepare: async ({ variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const rawId = String(variables.id ?? '');\n const rawPagePath = String(variables.pagePath ?? '');\n return {\n entityManifest: entityManifestItem,\n entityConfig: entityModule.config,\n id: rawId,\n pagePath: rawPagePath,\n };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedDetail = prepared as PreparedDetailUnknownPage;\n return (\n <Component\n entityManifest={preparedDetail.entityManifest}\n config={preparedDetail.entityConfig}\n prepared={preparedDetail}\n />\n );\n },\n }),\n ],\n });\n routeEntityIdMap.set(detailLayoutRoute, entityManifestItem.id);\n children.push(detailLayoutRoute);\n\n return rBackoffice({\n path: listRelative,\n children,\n resourcePage: WrapperPageResource,\n });\n });\n\n const toolsRoutes = Object.values(entityManifest)\n .filter((entity) => {\n return entity.kind === 'tool';\n })\n .map((toolManifest) => {\n const toolRelative = buildRelativePath(\n toolManifest.routes.list,\n baseSegment,\n );\n const toolRoute = rBackoffice({\n path: toolRelative,\n resourcePage: input.toolsOperationPage ?? null,\n prepare: async () => {\n const toolModule = await entityRegistry.loadToolEntity(\n toolManifest.id,\n );\n return {\n entityId: toolManifest.id,\n entityManifest: toolManifest,\n entityConfig: toolModule.config,\n } satisfies BackofficePreparedToolRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedTool = prepared as BackofficePreparedToolRoute;\n return (\n <Component\n entityManifest={preparedTool.entityManifest}\n operation={preparedTool.entityConfig.tool.operation}\n toolId={preparedTool.entityConfig.id}\n />\n );\n },\n });\n routeEntityIdMap.set(toolRoute, toolManifest.id);\n return toolRoute;\n });\n\n const layoutRoute = rBackoffice({\n path: baseSegment,\n resourcePage: BackofficeLayoutPageResource,\n prepareSearchBehavior: 'path',\n prepare: layoutPrepare,\n render: ({ children, prepared, route, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedLayout = prepared as PreparedLayout | undefined;\n const activeEntityId = resolveActiveEntityIdFromRoute(\n route,\n routeEntityIdMap,\n );\n const activeGroupId =\n activeEntityId != null\n ? (entityIdToGroupId.get(activeEntityId) ?? null)\n : resolveActiveEntityIdFromRoute(route, routeGroupIdMap);\n const LayoutComponent = Component as LayoutRouteComponent;\n const authStatusQuery = auth.session.get()?.authStatusQuery ?? null;\n if (authStatusQuery != null && preparedLayout?.authStatusQuery != null) {\n return (\n <BackofficeLayoutRouteWithAuthStatus\n Component={LayoutComponent}\n preparedLayout={preparedLayout}\n permissionsQuery={sidebar?.permissionsQuery}\n activeGroupId={activeGroupId}\n authStatusQuery={authStatusQuery}\n authStatusPrepared={preparedLayout.authStatusQuery}\n loginRedirectPath={loginRedirectPath}\n >\n {children}\n </BackofficeLayoutRouteWithAuthStatus>\n );\n }\n return (\n <BackofficeLayoutRouteWithoutAuthStatus\n Component={LayoutComponent}\n preparedLayout={preparedLayout}\n permissionsQuery={sidebar?.permissionsQuery}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutRouteWithoutAuthStatus>\n );\n },\n children: [\n dashboardRoute,\n ...hubRoutes,\n ...entityRoutes,\n ...toolsRoutes,\n ...secondaryDashboardRoutes,\n dashboardAliasRoute,\n ],\n });\n\n const routes: Route<BackofficeRouterContext, any>[] = [\n rBackoffice({\n path: loginPath,\n resourcePage: BackofficeLoginPageResource,\n prepare: async ({ context }) => {\n const loginAuth = await auth.login.load();\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n loginAuth.loginQuery,\n {},\n );\n return { query: queryRef };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component prepared={prepared} />;\n },\n }),\n rBackoffice({\n path: passwordResetRequestPath,\n resourcePage: BackofficePasswordResetRequestPageResource,\n prepare: async () => {\n await auth.passwordResetRequest.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: passwordResetCompletePath,\n resourcePage: BackofficePasswordResetCompletePageResource,\n prepare: async () => {\n await auth.passwordResetComplete.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: verifyEmailPath,\n resourcePage: BackofficeVerifyEmailPageResource,\n prepare: async () => {\n await auth.verifyEmail.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n ];\n\n if (auth.hasAcceptInvitation === true || auth.acceptInvitation != null) {\n routes.push(\n rBackoffice({\n path: acceptInvitationPath,\n resourcePage: BackofficeAcceptInvitationPageResource,\n prepare: async () => {\n await auth.acceptInvitation?.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n );\n }\n\n routes.push(layoutRoute);\n\n return routes;\n}\n\nexport const __test = {\n normalizeBaseSegment,\n normalizePath,\n buildScopedPath,\n buildScopedAbsolutePath,\n buildRelativePath,\n resolveActiveEntityIdFromRoute,\n toSearchParams,\n validateBackofficeDashboardRegistrations,\n BackofficeLayoutRouteWithAuthStatus,\n} as const;\n\nexport default createBackofficeRoutes;\n"],"mappings":"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"}
1
+ {"version":3,"file":"createBackofficeRoutes.js","names":[],"sources":["../../../src/router/createBackofficeRoutes.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useContext,\n useEffect,\n type ComponentType,\n type JSX,\n type ReactNode,\n} from 'react';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport {\n getResourcePage,\n type ResourcePage,\n} from '@plumile/router/ResourcePage.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport { r } from '@plumile/router/tools.js';\nimport { type AnyRoute, type Route } from '@plumile/router/types.js';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type {\n Environment,\n GraphQLTaggedNode,\n OperationType,\n} from 'relay-runtime';\n\nimport { BACKOFFICE_LIST_DEFAULTS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeDashboardConfig,\n BackofficeEntityManifestMap,\n BackofficePreparedDetailLayoutRoute,\n BackofficePreparedDetailPageRoute,\n BackofficePreparedListRoute,\n BackofficePreparedToolRoute,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardRegistration,\n BackofficeDashboardModule,\n BackofficeResolvedSidebarHubConfig,\n BackofficeSidebarConfig,\n} from '../provider/types.js';\nimport {\n buildEntityGroupLookup,\n resolveSidebarHubEntries,\n resolveSidebarGroups,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport type { BackofficeEntityRegistry } from '../provider/entityRegistry.js';\nimport { validateBackofficeDashboardRegistrations } from '../provider/dashboardRegistrations.js';\n\nconst { loadQuery, usePreloadedQuery } = ReactRelay;\n\nexport type CreateBackofficeRoutesInput = {\n basePath: string;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n sidebar?: BackofficeSidebarConfig;\n auth: BackofficeAuthConfig;\n dashboard?: BackofficeDashboardModule;\n dashboards?: readonly BackofficeDashboardRegistration[];\n toolsOperationPage?: ResourcePage | null;\n};\n\nexport type BackofficeRouterContext = {\n relayEnvironment: Environment;\n};\n\nexport const WrapperPageResource: ResourcePage | null = getResourcePage(\n 'WrapperPage',\n // eslint-disable-next-line arrow-body-style\n async () => ({\n default: (await import('@plumile/ui/pages/WrapperPage.js')).WrapperPage,\n }),\n);\n\nexport const BackofficeLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLayoutPage.js'),\n );\n\nexport const BackofficeEntityListPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityListPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityListPage.js'),\n );\n\nexport const BackofficeEntityDetailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailPage.js'),\n );\n\nexport const BackofficeEntityDetailLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailLayoutPage.js'),\n );\n\nexport const BackofficeEntityDetailUnknownPageRedirectResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailUnknownPageRedirect',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailUnknownPageRedirect.js'),\n );\n\nexport const BackofficeDashboardPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeDashboardPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeDashboardPage.js'),\n );\n\nexport const BackofficeHubPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeHubPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeHubPage.js'),\n);\n\nexport const BackofficeLoginPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeLoginPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLoginPage.js'),\n);\n\nexport const BackofficePasswordResetRequestPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetRequestPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetRequestPage.js'),\n );\n\nexport const BackofficePasswordResetCompletePageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetCompletePage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetCompletePage.js'),\n );\n\nexport const BackofficeVerifyEmailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeVerifyEmailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeVerifyEmailPage.js'),\n );\n\nexport const BackofficeAcceptInvitationPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeAcceptInvitationPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeAcceptInvitationPage.js'),\n );\n\ntype PreparedDetailUnknownPage = {\n id: string;\n pagePath: string;\n entityManifest: BackofficeEntityManifestMap[string];\n entityConfig: BackofficeResolvedDetailLayoutFacetConfigBase;\n};\n\ntype PreparedLayout = {\n permissionsQuery: PreloadedQuery<OperationType> | null;\n authStatusQuery: PreloadedQuery<OperationType> | null;\n};\n\nexport type BackofficePreparedDashboardRoute = {\n dashboardId: string;\n config: BackofficeDashboardConfig;\n};\n\ntype LayoutAuthStatus = {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n} | null;\n\ntype LayoutRouteComponent = ComponentType<{\n children: ReactNode;\n permissionsQuery?: GraphQLTaggedNode;\n prepared?: PreloadedQuery<OperationType> | null;\n authStatus?: LayoutAuthStatus;\n activeGroupId?: string | null;\n}>;\n\ntype LayoutRouteRenderProps = {\n children: ReactNode;\n Component: LayoutRouteComponent;\n preparedLayout: PreparedLayout | undefined;\n permissionsQuery: GraphQLTaggedNode | undefined;\n activeGroupId: string | null;\n};\n\nconst BackofficeLoginRedirect = ({\n loginRedirectPath,\n}: {\n loginRedirectPath: string;\n}): null => {\n const router = useContext(RoutingContext);\n\n useEffect(() => {\n router?.history.set({\n pathname: loginRedirectPath,\n });\n }, [loginRedirectPath, router]);\n\n return null;\n};\n\nconst BackofficeLayoutRouteWithoutAuthStatus = ({\n children,\n Component,\n preparedLayout,\n permissionsQuery,\n activeGroupId,\n}: LayoutRouteRenderProps): JSX.Element => {\n return (\n <Component\n permissionsQuery={permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={null}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n};\n\nconst BackofficeLayoutRouteWithAuthStatus = ({\n children,\n Component,\n preparedLayout,\n permissionsQuery,\n activeGroupId,\n authStatusQuery,\n authStatusPrepared,\n loginRedirectPath,\n}: LayoutRouteRenderProps & {\n authStatusQuery: GraphQLTaggedNode;\n authStatusPrepared: PreloadedQuery<OperationType>;\n loginRedirectPath: string;\n}): JSX.Element => {\n const data = usePreloadedQuery(authStatusQuery, authStatusPrepared);\n const authStatus = data as LayoutAuthStatus;\n\n if (authStatus?.isLoggedIn !== true) {\n return <BackofficeLoginRedirect loginRedirectPath={loginRedirectPath} />;\n }\n\n return (\n <Component\n permissionsQuery={permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n};\n\nexport type BackofficePreparedHubRoute = {\n hubId: string;\n hub: BackofficeResolvedSidebarHubConfig;\n};\n\nconst normalizeBaseSegment = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '/') {\n return '';\n }\n return trimmed.replace(/^\\/+|\\/+$/g, '');\n};\n\nconst normalizePath = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '') {\n return '/';\n }\n return `/${trimmed}`.replace(/\\/+/g, '/');\n};\n\nconst buildScopedPath = (baseSegment: string, path: string): string => {\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n if (baseSegment === '') {\n return normalizedPath;\n }\n if (normalizedPath === '') {\n return baseSegment;\n }\n return `${baseSegment}/${normalizedPath}`;\n};\n\nconst buildScopedAbsolutePath = (baseSegment: string, path: string): string => {\n return normalizePath(buildScopedPath(baseSegment, path));\n};\n\nconst buildRelativePath = (\n absolutePath: string,\n baseSegment: string,\n): string => {\n const normalized = normalizePath(absolutePath);\n const basePrefix = baseSegment === '' ? '' : `/${baseSegment}`;\n if (basePrefix !== '' && normalized.startsWith(basePrefix)) {\n return normalized.slice(basePrefix.length).replace(/^\\/+/, '');\n }\n return normalized.replace(/^\\/+/, '');\n};\n\nconst resolveActiveEntityIdFromRoute = (\n route: { routes: AnyRoute[] } | null,\n routeEntityIdMap: WeakMap<AnyRoute, string>,\n): string | null => {\n if (route?.routes == null) {\n return null;\n }\n for (let index = route.routes.length - 1; index >= 0; index -= 1) {\n const routeEntry = route.routes[index];\n if (routeEntry != null) {\n const entityId = routeEntityIdMap.get(routeEntry);\n if (entityId != null) {\n return entityId;\n }\n }\n }\n return null;\n};\n\nconst toSearchParams = (query: Record<string, unknown>): URLSearchParams => {\n const params = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value == null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n if (entry == null) {\n return;\n }\n params.append(key, String(entry));\n });\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n params.set(key, String(value));\n });\n return params;\n};\n\nconst rBackoffice = r<BackofficeRouterContext>;\n\n/**\n * Creates backoffice routes based on the provided configuration\n */\nexport function createBackofficeRoutes(\n input: CreateBackofficeRoutesInput,\n): Route<BackofficeRouterContext, any>[] {\n const { basePath, entityManifest, entityRegistry, sidebar, auth, dashboard } =\n input;\n const dashboards = validateBackofficeDashboardRegistrations(input.dashboards);\n const baseSegment = normalizeBaseSegment(basePath);\n const loginPath = buildScopedPath(baseSegment, 'login');\n const passwordResetRequestPath = buildScopedPath(baseSegment, 'login/reset');\n const passwordResetCompletePath = buildScopedPath(\n baseSegment,\n 'login/reset/complete',\n );\n const verifyEmailPath = buildScopedPath(baseSegment, 'verify-email');\n const acceptInvitationPath = buildScopedPath(\n baseSegment,\n 'accept-invitation',\n );\n const loginRedirectPath = buildScopedAbsolutePath(baseSegment, 'login');\n const entities = entityManifest;\n const groups = resolveSidebarGroups(entities, sidebar);\n const hubEntries = resolveSidebarHubEntries(groups, sidebar);\n const entityGroupLookup = buildEntityGroupLookup(groups, sidebar);\n const entityIdToGroupId = new Map<string, string>();\n entityGroupLookup.forEach((value, entityId) => {\n entityIdToGroupId.set(entityId, value.groupId);\n });\n const routeEntityIdMap = new WeakMap<AnyRoute, string>();\n const routeGroupIdMap = new WeakMap<AnyRoute, string>();\n\n const permissionsQuery = sidebar?.permissionsQuery;\n const layoutPrepare = async ({\n context,\n }: {\n context: BackofficeRouterContext;\n }) => {\n const sessionAuth = await auth.session.load();\n const permissionsQueryRef =\n permissionsQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n permissionsQuery,\n {},\n )\n : null;\n const authStatusQueryRef =\n sessionAuth.authStatusQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n sessionAuth.authStatusQuery,\n {},\n { fetchPolicy: 'network-only' },\n )\n : null;\n return {\n permissionsQuery: permissionsQueryRef,\n authStatusQuery: authStatusQueryRef,\n };\n };\n\n const prepareRootDashboard =\n async (): Promise<BackofficePreparedDashboardRoute | null> => {\n if (dashboard == null) {\n return null;\n }\n const config = await dashboard.load();\n return {\n dashboardId: 'dashboard',\n config,\n };\n };\n const renderDashboard = ({\n prepared,\n Component,\n }: {\n prepared: unknown;\n Component?: ComponentType<Record<string, unknown>> | null;\n }): JSX.Element | null => {\n if (Component == null) {\n return null;\n }\n const DashboardComponent = Component as ComponentType<{\n prepared?: unknown;\n }>;\n return <DashboardComponent prepared={prepared} />;\n };\n\n const dashboardRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeDashboardPageResource,\n prepare: prepareRootDashboard,\n render: renderDashboard,\n });\n const dashboardAliasRoute = rBackoffice({\n path: 'dashboard',\n resourcePage: BackofficeDashboardPageResource,\n prepare: prepareRootDashboard,\n render: renderDashboard,\n });\n const secondaryDashboardRoutes = dashboards.map((registration) => {\n return rBackoffice({\n path: `dashboard/${registration.id}`,\n resourcePage: BackofficeDashboardPageResource,\n prepare: async () => {\n const config = await registration.module.load();\n return {\n dashboardId: registration.id,\n config,\n } satisfies BackofficePreparedDashboardRoute;\n },\n render: renderDashboard,\n });\n });\n\n const listEntityEntries = Object.values(entityManifest).filter((entity) => {\n return entity.kind === 'list-detail';\n });\n\n const hubRoutes = hubEntries.map((entry) => {\n const hubRelative = buildRelativePath(entry.hub.href, baseSegment);\n const hubRoute = rBackoffice({\n path: hubRelative,\n resourcePage: BackofficeHubPageResource,\n prepare: () => {\n return {\n hubId: entry.hub.id,\n hub: entry.hub,\n } satisfies BackofficePreparedHubRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component prepared={prepared} />;\n },\n });\n if (entry.groupId != null) {\n routeGroupIdMap.set(hubRoute, entry.groupId);\n }\n return hubRoute;\n });\n\n const entityRoutes = listEntityEntries.map((entityManifestItem) => {\n const listPath = entityManifestItem.routes.list;\n const listRelative = buildRelativePath(listPath, baseSegment);\n const children: Route<any, any>[] = [];\n\n if (entityManifestItem.hasList) {\n const listRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeEntityListPageResource,\n prepareSearchBehavior: 'path',\n prepare: async ({ context, query }) => {\n const entityModule = await entityRegistry.loadListEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const { list, listUrlCodec, listDefaults } = config;\n if (listUrlCodec == null || listDefaults == null) {\n throw new Error(\n `Backoffice entity ${entityManifestItem.id} does not expose a list configuration.`,\n );\n }\n const params = toSearchParams(query);\n const state = listUrlCodec.parse(params);\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables = list.buildQueryVariables(variablesBase);\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n list.query,\n variables,\n );\n const prepared: BackofficePreparedListRoute = {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n query: queryRef,\n };\n return prepared;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedListRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n routeEntityIdMap.set(listRoute, entityManifestItem.id);\n children.push(listRoute);\n }\n\n const detailLayoutRoute = rBackoffice({\n path: ':id',\n resourcePage: BackofficeEntityDetailLayoutPageResource,\n prepare: async ({ context, variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const rawId = String(variables.id ?? '');\n const layoutBuildResult =\n config.layoutPage.buildVariables != null\n ? config.layoutPage.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const layoutQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n config.layoutPage.query,\n layoutBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n layoutQuery: layoutQueryRef,\n id: rawId,\n } satisfies BackofficePreparedDetailLayoutRoute;\n },\n render: ({ children: detailChildren, prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedDetailLayoutRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n >\n {detailChildren}\n </Component>\n );\n },\n children: [\n rBackoffice({\n path: '',\n resourcePage: WrapperPageResource,\n prepare: ({ variables }) => {\n const rawId = String(variables.id ?? '').trim();\n return {\n redirectTo:\n rawId === ''\n ? null\n : entityManifestItem.routes.detailPage(\n rawId,\n entityManifestItem.defaultDetailPageId ?? 'overview',\n ),\n };\n },\n render: ({ prepared }) => {\n const redirectTo =\n (prepared as { redirectTo?: string | null }).redirectTo ?? null;\n if (redirectTo == null) {\n return null;\n }\n throw new HttpRedirect(redirectTo);\n },\n }),\n ...(entityManifestItem.detailPages ?? []).map((pageManifest) => {\n return rBackoffice({\n path: pageManifest.pathSegment,\n resourcePage: BackofficeEntityDetailPageResource,\n prepare: async ({ context, variables }) => {\n const rawId = String(variables.id ?? '');\n const pageModule = await entityRegistry.loadDetailPageEntity(\n entityManifestItem.id,\n pageManifest.id,\n );\n const pageBuildResult =\n pageModule.config.page.buildVariables != null\n ? pageModule.config.page.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const pageQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n pageModule.config.page.query,\n pageBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig:\n pageModule.config as unknown as BackofficeResolvedDetailLayoutFacetConfigBase,\n detailId: pageBuildResult.detailId,\n id: rawId,\n pageConfig: pageModule.config,\n pageQuery: pageQueryRef,\n pageId: pageManifest.id,\n pagePath: pageManifest.pathSegment,\n } satisfies BackofficePreparedDetailPageRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute =\n prepared as BackofficePreparedDetailPageRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n }),\n rBackoffice({\n path: ':pagePath',\n resourcePage: BackofficeEntityDetailUnknownPageRedirectResource,\n prepare: async ({ variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const rawId = String(variables.id ?? '');\n const rawPagePath = String(variables.pagePath ?? '');\n return {\n entityManifest: entityManifestItem,\n entityConfig: entityModule.config,\n id: rawId,\n pagePath: rawPagePath,\n };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedDetail = prepared as PreparedDetailUnknownPage;\n return (\n <Component\n entityManifest={preparedDetail.entityManifest}\n config={preparedDetail.entityConfig}\n prepared={preparedDetail}\n />\n );\n },\n }),\n ],\n });\n routeEntityIdMap.set(detailLayoutRoute, entityManifestItem.id);\n children.push(detailLayoutRoute);\n\n return rBackoffice({\n path: listRelative,\n children,\n resourcePage: WrapperPageResource,\n });\n });\n\n const toolsRoutes = Object.values(entityManifest)\n .filter((entity) => {\n return entity.kind === 'tool';\n })\n .map((toolManifest) => {\n const toolRelative = buildRelativePath(\n toolManifest.routes.list,\n baseSegment,\n );\n const toolRoute = rBackoffice({\n path: toolRelative,\n resourcePage: input.toolsOperationPage ?? null,\n prepare: async () => {\n const toolModule = await entityRegistry.loadToolEntity(\n toolManifest.id,\n );\n return {\n entityId: toolManifest.id,\n entityManifest: toolManifest,\n entityConfig: toolModule.config,\n } satisfies BackofficePreparedToolRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedTool = prepared as BackofficePreparedToolRoute;\n return (\n <Component\n entityManifest={preparedTool.entityManifest}\n operation={preparedTool.entityConfig.tool.operation}\n toolId={preparedTool.entityConfig.id}\n />\n );\n },\n });\n routeEntityIdMap.set(toolRoute, toolManifest.id);\n return toolRoute;\n });\n\n const layoutRoute = rBackoffice({\n path: baseSegment,\n resourcePage: BackofficeLayoutPageResource,\n prepareSearchBehavior: 'path',\n prepare: layoutPrepare,\n render: ({ children, prepared, route, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedLayout = prepared as PreparedLayout | undefined;\n const activeEntityId = resolveActiveEntityIdFromRoute(\n route,\n routeEntityIdMap,\n );\n const activeGroupId =\n activeEntityId != null\n ? (entityIdToGroupId.get(activeEntityId) ?? null)\n : resolveActiveEntityIdFromRoute(route, routeGroupIdMap);\n const LayoutComponent = Component as LayoutRouteComponent;\n const authStatusQuery = auth.session.get()?.authStatusQuery ?? null;\n if (authStatusQuery != null && preparedLayout?.authStatusQuery != null) {\n return (\n <BackofficeLayoutRouteWithAuthStatus\n Component={LayoutComponent}\n preparedLayout={preparedLayout}\n permissionsQuery={sidebar?.permissionsQuery}\n activeGroupId={activeGroupId}\n authStatusQuery={authStatusQuery}\n authStatusPrepared={preparedLayout.authStatusQuery}\n loginRedirectPath={loginRedirectPath}\n >\n {children}\n </BackofficeLayoutRouteWithAuthStatus>\n );\n }\n return (\n <BackofficeLayoutRouteWithoutAuthStatus\n Component={LayoutComponent}\n preparedLayout={preparedLayout}\n permissionsQuery={sidebar?.permissionsQuery}\n activeGroupId={activeGroupId}\n >\n {children}\n </BackofficeLayoutRouteWithoutAuthStatus>\n );\n },\n children: [\n dashboardRoute,\n ...hubRoutes,\n ...entityRoutes,\n ...toolsRoutes,\n ...secondaryDashboardRoutes,\n dashboardAliasRoute,\n ],\n });\n\n const routes: Route<BackofficeRouterContext, any>[] = [\n rBackoffice({\n path: loginPath,\n resourcePage: BackofficeLoginPageResource,\n prepare: async ({ context }) => {\n const loginAuth = await auth.login.load();\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n loginAuth.loginQuery,\n {},\n );\n return { query: queryRef };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component prepared={prepared} />;\n },\n }),\n rBackoffice({\n path: passwordResetRequestPath,\n resourcePage: BackofficePasswordResetRequestPageResource,\n prepare: async () => {\n await auth.passwordResetRequest.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: passwordResetCompletePath,\n resourcePage: BackofficePasswordResetCompletePageResource,\n prepare: async () => {\n await auth.passwordResetComplete.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: verifyEmailPath,\n resourcePage: BackofficeVerifyEmailPageResource,\n prepare: async () => {\n await auth.verifyEmail.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n ];\n\n if (auth.hasAcceptInvitation === true || auth.acceptInvitation != null) {\n routes.push(\n rBackoffice({\n path: acceptInvitationPath,\n resourcePage: BackofficeAcceptInvitationPageResource,\n prepare: async () => {\n await auth.acceptInvitation?.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n );\n }\n\n routes.push(layoutRoute);\n\n return routes;\n}\n\nexport const __test = {\n normalizeBaseSegment,\n normalizePath,\n buildScopedPath,\n buildScopedAbsolutePath,\n buildRelativePath,\n resolveActiveEntityIdFromRoute,\n toSearchParams,\n validateBackofficeDashboardRegistrations,\n BackofficeLayoutRouteWithAuthStatus,\n} as const;\n\nexport default createBackofficeRoutes;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /* empty css */
2
2
  //#region src/storybook/relay/RelayStory.css.ts
3
- var e = "txvbqbuyj", t = "txvbqbfd0", n = "txvbqb96 txvbqb19ef", r = "txvbqbq0i";
3
+ var e = "txvbqbwii", t = "txvbqbgwz", n = "txvbqb96 txvbqb1b4z", r = "txvbqbrkh";
4
4
  //#endregion
5
5
  export { r as errorAction, e as errorContainer, n as errorMessage, t as errorTitle };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"RelayStory.js","names":[],"sources":["../../../../src/storybook/relay/RelayStory.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport {\n RelayEnvironmentProvider,\n loadQuery,\n useLazyLoadQuery,\n type GraphQLTaggedNode,\n type PreloadedQuery,\n} from 'react-relay';\nimport type {\n OperationDescriptor,\n OperationType,\n Variables,\n} from 'relay-runtime';\nimport {\n createMockEnvironment,\n MockPayloadGenerator,\n type MockResolvers,\n} from 'relay-test-utils';\n\nimport { BackofficeErrorBoundary } from '../../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { createBackofficeMockResolvers } from './mockResolvers.js';\nimport * as styles from './RelayStory.css.js';\n\ntype RelayMockOptions = {\n nodeType?: string;\n mockResolvers?: MockResolvers;\n};\n\nconst buildMockResolvers = ({\n nodeType,\n mockResolvers,\n}: RelayMockOptions): MockResolvers | undefined => {\n const baseResolvers = createBackofficeMockResolvers();\n\n const resolved: MockResolvers = {\n ...baseResolvers,\n ...(mockResolvers ?? {}),\n };\n\n if (nodeType != null) {\n resolved.Node = () => {\n return { __typename: nodeType };\n };\n }\n\n return resolved;\n};\n\nconst StoryErrorFallback = ({\n error,\n reset,\n}: {\n error: unknown;\n reset: () => void;\n}): JSX.Element => {\n let message = 'Unknown error';\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n\n return (\n <div className={styles.errorContainer}>\n <div className={styles.errorTitle}>Unable to render story</div>\n <div className={styles.errorMessage}>{message}</div>\n <button\n type=\"button\"\n onClick={() => {\n reset();\n }}\n className={styles.errorAction}\n >\n Retry\n </button>\n </div>\n );\n};\n\ntype RelayQueryRendererProps<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (data: Query['response']) => ReactNode;\n};\n\nconst RelayQueryRenderer = <Query extends OperationType>({\n query,\n variables,\n render,\n}: RelayQueryRendererProps<Query>): JSX.Element => {\n const data = useLazyLoadQuery<Query>(query, variables);\n return <>{render(data)}</>;\n};\n\ntype RelayLazyLoadStoryOptions<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (data: Query['response']) => ReactNode;\n fallback?: ReactNode;\n} & RelayMockOptions;\n\nexport const renderRelayLazyLoadStory = <Query extends OperationType>(\n options: RelayLazyLoadStoryOptions<Query>,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n environment.mock.queuePendingOperation(options.query, options.variables);\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n <RelayQueryRenderer\n query={options.query}\n variables={options.variables}\n render={options.render}\n />\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n\ntype RelayProviderStoryOptions = {\n children: ReactNode;\n fallback?: ReactNode;\n pendingOperations?: readonly {\n query: GraphQLTaggedNode;\n variables: Variables;\n }[];\n} & RelayMockOptions;\n\nexport const renderRelayProviderStory = (\n options: RelayProviderStoryOptions,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n\n options.pendingOperations?.forEach((pending) => {\n environment.mock.queuePendingOperation(pending.query, pending.variables);\n });\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n {options.children}\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n\ntype RelayPreloadedStoryOptions<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (prepared: { query: PreloadedQuery<Query> }) => ReactNode;\n fallback?: ReactNode;\n} & RelayMockOptions;\n\nexport const renderRelayPreloadedStory = <Query extends OperationType>(\n options: RelayPreloadedStoryOptions<Query>,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n environment.mock.queuePendingOperation(options.query, options.variables);\n\n const prepared = {\n query: loadQuery<Query>(environment, options.query, options.variables),\n };\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n {options.render(prepared)}\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n"],"mappings":";;;;;;;;aA4BM,KAAsB,EAC1B,aACA,uBACiD;CAGjD,IAAM,IAA0B;EAC9B,GAHoB,GAGjB;EACH,GAAI,KAAiB,EAAE;EACxB;CAQD,OANI,KAAY,SACd,EAAS,cACA,EAAE,YAAY,GAAU,IAI5B;GAGH,KAAsB,EAC1B,UACA,eAIiB;CACjB,IAAI,IAAU;CAOd,OANA,AAGE,IAHE,aAAiB,QACT,EAAM,UAEN,OAAO,EAAM,EAIvB,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IAAK,WAAW;cAAmB;IAA4B,CAAA;GAC/D,kBAAC,OAAD;IAAK,WAAW;cAAsB;IAAc,CAAA;GACpD,kBAAC,UAAD;IACE,MAAK;IACL,eAAe;KACb,GAAO;;IAET,WAAW;cACZ;IAEQ,CAAA;GACL;;GAUJ,KAAmD,EACvD,UACA,cACA,gBAGO,kBAAA,GAAA,EAAA,UAAG,EADG,EAAwB,GAAO,EAC3B,CAAK,EAAI,CAAA,EAUf,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,wBAAqC,EACrC,IAAY,EAAmB,EAAQ;CAU7C,OARA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,EAAU,GAE1C,EAAA,qBAAqB,SAAS,GAAW,EAAU,CAC1D,EACF,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,UAAU,EAGtE,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,cAAgB,CAAA;aAC3D,kBAAC,GAAD;IAAyB,UAAU;cACjC,kBAAC,GAAD;KACE,OAAO,EAAQ;KACf,WAAW,EAAQ;KACnB,QAAQ,EAAQ;KAChB,CAAA;IACsB,CAAA;GACjB,CAAA;EACc,CAAA;GAalB,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,wBAAqC,EACrC,IAAY,EAAmB,EAAQ;CAa7C,OAXA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,EAAU,GAE1C,EAAA,qBAAqB,SAAS,GAAW,EAAU,CAC1D,EAEF,EAAQ,mBAAmB,SAAS,MAAY;EAC9C,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,UAAU;GACxE,EAGA,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,cAAgB,CAAA;aAC3D,kBAAC,GAAD;IAAyB,UAAU;cAChC,EAAQ;IACe,CAAA;GACjB,CAAA;EACc,CAAA;GAWlB,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,wBAAqC,EACrC,IAAY,EAAmB,EAAQ;CAQ7C,AANA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,EAAU,GAE1C,EAAA,qBAAqB,SAAS,GAAW,EAAU,CAC1D,EACF,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,UAAU;CAExE,IAAM,IAAW,EACf,OAAO,EAAiB,GAAa,EAAQ,OAAO,EAAQ,UAAU,EACvE;CAED,OACE,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,cAAgB,CAAA;aAC3D,kBAAC,GAAD;IAAyB,UAAU;cAChC,EAAQ,OAAO,EAAS;IACD,CAAA;GACjB,CAAA;EACc,CAAA"}
1
+ {"version":3,"file":"RelayStory.js","names":[],"sources":["../../../../src/storybook/relay/RelayStory.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport {\n RelayEnvironmentProvider,\n loadQuery,\n useLazyLoadQuery,\n type GraphQLTaggedNode,\n type PreloadedQuery,\n} from 'react-relay';\nimport type {\n OperationDescriptor,\n OperationType,\n Variables,\n} from 'relay-runtime';\nimport {\n createMockEnvironment,\n MockPayloadGenerator,\n type MockResolvers,\n} from 'relay-test-utils';\n\nimport { BackofficeErrorBoundary } from '../../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { createBackofficeMockResolvers } from './mockResolvers.js';\nimport * as styles from './RelayStory.css.js';\n\ntype RelayMockOptions = {\n nodeType?: string;\n mockResolvers?: MockResolvers;\n};\n\nconst buildMockResolvers = ({\n nodeType,\n mockResolvers,\n}: RelayMockOptions): MockResolvers | undefined => {\n const baseResolvers = createBackofficeMockResolvers();\n\n const resolved: MockResolvers = {\n ...baseResolvers,\n ...(mockResolvers ?? {}),\n };\n\n if (nodeType != null) {\n resolved.Node = () => {\n return { __typename: nodeType };\n };\n }\n\n return resolved;\n};\n\nconst StoryErrorFallback = ({\n error,\n reset,\n}: {\n error: unknown;\n reset: () => void;\n}): JSX.Element => {\n let message = 'Unknown error';\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n\n return (\n <div className={styles.errorContainer}>\n <div className={styles.errorTitle}>Unable to render story</div>\n <div className={styles.errorMessage}>{message}</div>\n <button\n type=\"button\"\n onClick={() => {\n reset();\n }}\n className={styles.errorAction}\n >\n Retry\n </button>\n </div>\n );\n};\n\ntype RelayQueryRendererProps<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (data: Query['response']) => ReactNode;\n};\n\nconst RelayQueryRenderer = <Query extends OperationType>({\n query,\n variables,\n render,\n}: RelayQueryRendererProps<Query>): JSX.Element => {\n const data = useLazyLoadQuery<Query>(query, variables);\n return <>{render(data)}</>;\n};\n\ntype RelayLazyLoadStoryOptions<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (data: Query['response']) => ReactNode;\n fallback?: ReactNode;\n} & RelayMockOptions;\n\nexport const renderRelayLazyLoadStory = <Query extends OperationType>(\n options: RelayLazyLoadStoryOptions<Query>,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n environment.mock.queuePendingOperation(options.query, options.variables);\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n <RelayQueryRenderer\n query={options.query}\n variables={options.variables}\n render={options.render}\n />\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n\ntype RelayProviderStoryOptions = {\n children: ReactNode;\n fallback?: ReactNode;\n pendingOperations?: readonly {\n query: GraphQLTaggedNode;\n variables: Variables;\n }[];\n} & RelayMockOptions;\n\nexport const renderRelayProviderStory = (\n options: RelayProviderStoryOptions,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n\n options.pendingOperations?.forEach((pending) => {\n environment.mock.queuePendingOperation(pending.query, pending.variables);\n });\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n {options.children}\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n\ntype RelayPreloadedStoryOptions<Query extends OperationType> = {\n query: GraphQLTaggedNode;\n variables: Query['variables'];\n render: (prepared: { query: PreloadedQuery<Query> }) => ReactNode;\n fallback?: ReactNode;\n} & RelayMockOptions;\n\nexport const renderRelayPreloadedStory = <Query extends OperationType>(\n options: RelayPreloadedStoryOptions<Query>,\n): JSX.Element => {\n const environment = createMockEnvironment();\n const resolvers = buildMockResolvers(options);\n\n environment.mock.queueOperationResolver((operation: OperationDescriptor) => {\n if (resolvers == null) {\n return MockPayloadGenerator.generate(operation);\n }\n return MockPayloadGenerator.generate(operation, resolvers);\n });\n environment.mock.queuePendingOperation(options.query, options.variables);\n\n const prepared = {\n query: loadQuery<Query>(environment, options.query, options.variables),\n };\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n <Suspense fallback={options.fallback ?? <div>Loading...</div>}>\n <BackofficeErrorBoundary fallback={StoryErrorFallback}>\n {options.render(prepared)}\n </BackofficeErrorBoundary>\n </Suspense>\n </RelayEnvironmentProvider>\n );\n};\n"],"mappings":";;;;;;;;aA4BM,KAAsB,EAC1B,aACA,uBACiD;CAGjD,IAAM,IAA0B;EAC9B,GAHoB,EAGjB;EACH,GAAI,KAAiB,CAAC;CACxB;CAQA,OANI,KAAY,SACd,EAAS,cACA,EAAE,YAAY,EAAS,KAI3B;AACT,GAEM,KAAsB,EAC1B,UACA,eAIiB;CACjB,IAAI,IAAU;CAOd,OANA,AAGE,IAHE,aAAiB,QACT,EAAM,UAEN,OAAO,CAAK,GAItB,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IAAK,WAAW;cAAmB;GAA2B,CAAA;GAC9D,kBAAC,OAAD;IAAK,WAAW;cAAsB;GAAa,CAAA;GACnD,kBAAC,UAAD;IACE,MAAK;IACL,eAAe;KACb,EAAM;IACR;IACA,WAAW;cACZ;GAEO,CAAA;EACL;;AAET,GAQM,KAAmD,EACvD,UACA,cACA,gBAGO,kBAAA,GAAA,EAAA,UAAG,EADG,EAAwB,GAAO,CAC3B,CAAI,EAAI,CAAA,GAUd,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,uBAAoC,GACpC,IAAY,EAAmB,CAAO;CAU5C,OARA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,CAAS,IAEzC,EAAA,qBAAqB,SAAS,GAAW,CAAS,CAC1D,GACD,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,SAAS,GAGrE,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,aAAe,CAAA;aAC1D,kBAAC,GAAD;IAAyB,UAAU;cACjC,kBAAC,GAAD;KACE,OAAO,EAAQ;KACf,WAAW,EAAQ;KACnB,QAAQ,EAAQ;IACjB,CAAA;GACsB,CAAA;EACjB,CAAA;CACc,CAAA;AAE9B,GAWa,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,uBAAoC,GACpC,IAAY,EAAmB,CAAO;CAa5C,OAXA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,CAAS,IAEzC,EAAA,qBAAqB,SAAS,GAAW,CAAS,CAC1D,GAED,EAAQ,mBAAmB,SAAS,MAAY;EAC9C,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,SAAS;CACzE,CAAC,GAGC,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,aAAe,CAAA;aAC1D,kBAAC,GAAD;IAAyB,UAAU;cAChC,EAAQ;GACc,CAAA;EACjB,CAAA;CACc,CAAA;AAE9B,GASa,KACX,MACgB;CAChB,IAAM,KAAA,GAAA,EAAA,uBAAoC,GACpC,IAAY,EAAmB,CAAO;CAQ5C,AANA,EAAY,KAAK,wBAAwB,MACnC,KAAa,OACR,EAAA,qBAAqB,SAAS,CAAS,IAEzC,EAAA,qBAAqB,SAAS,GAAW,CAAS,CAC1D,GACD,EAAY,KAAK,sBAAsB,EAAQ,OAAO,EAAQ,SAAS;CAEvE,IAAM,IAAW,EACf,OAAO,EAAiB,GAAa,EAAQ,OAAO,EAAQ,SAAS,EACvE;CAEA,OACE,kBAAC,GAAD;EAAuC;YACrC,kBAAC,GAAD;GAAU,UAAU,EAAQ,YAAY,kBAAC,OAAD,EAAA,UAAK,aAAe,CAAA;aAC1D,kBAAC,GAAD;IAAyB,UAAU;cAChC,EAAQ,OAAO,CAAQ;GACD,CAAA;EACjB,CAAA;CACc,CAAA;AAE9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"mockResolvers.js","names":[],"sources":["../../../../src/storybook/relay/mockResolvers.ts"],"sourcesContent":["import type { MockResolverContext, MockResolvers } from 'relay-test-utils';\n\n/**\n *\n */\nfunction toLabel(value: string): string {\n const withSpaces = value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n if (withSpaces === '') {\n return value;\n }\n return withSpaces;\n}\n\n/**\n *\n */\nfunction toSlug(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\n/**\n *\n */\nfunction createCounter(): (key: string) => number {\n const counts = new Map<string, number>();\n return (key: string) => {\n const next = (counts.get(key) ?? 0) + 1;\n counts.set(key, next);\n return next;\n };\n}\n\nconst FIRST_NAMES = ['Avery', 'Jordan', 'Taylor', 'Morgan', 'Casey'] as const;\nconst LAST_NAMES = ['Lee', 'Parker', 'Carter', 'Nguyen', 'Patel'] as const;\n\n/**\n *\n */\nfunction pickName(list: readonly string[], index: number): string {\n const candidate = list[(index - 1) % list.length];\n if (candidate == null) {\n return 'User';\n }\n return candidate;\n}\n\n/**\n *\n */\nexport function createBackofficeMockResolvers(): MockResolvers {\n const next = createCounter();\n const baseDate = Date.parse('2024-01-15T09:30:00.000Z');\n\n /**\n *\n */\n function stringResolver(context: MockResolverContext): string {\n const fieldName = context.alias ?? context.name ?? 'value';\n const parentType = context.parentType ?? 'Item';\n const label = toLabel(parentType);\n const key = `${parentType}.${fieldName}`;\n const index = next(key);\n\n switch (fieldName) {\n case 'name':\n case 'title':\n case 'label':\n return `${label} ${index}`;\n case 'firstName':\n return pickName(FIRST_NAMES, index);\n case 'lastName':\n return pickName(LAST_NAMES, index);\n case 'initials':\n return 'JD';\n case 'email':\n return `user${index}@example.com`;\n case 'slug':\n case 'handle':\n return `${toSlug(label)}-${index}`;\n case 'url':\n case 'uri':\n case 'avatarUrl':\n case 'imageUrl':\n case 'iconUrl':\n return `https://example.com/${toSlug(label)}/${index}`;\n case 'description':\n case 'summary':\n case 'content':\n case 'body':\n case 'notes':\n case 'message':\n return `Sample ${fieldName} for ${label}.`;\n case 'markdown':\n case 'summaryMarkdown':\n case 'notesForDev':\n case 'descriptionMarkdown':\n case 'suggestedFixMarkdown':\n return `Sample ${fieldName} for ${label}.`;\n default:\n return `${label} ${fieldName} ${index}`;\n }\n }\n\n /**\n *\n */\n function resolveId(context: MockResolverContext): string {\n const parentType = context.parentType ?? 'node';\n const index = next(`${parentType}.id`);\n return `${toSlug(parentType)}-${index}`;\n }\n\n /**\n *\n */\n function resolveInt(context: MockResolverContext): number {\n const key = `${context.parentType ?? 'value'}.${context.name ?? 'int'}`;\n return next(key);\n }\n\n /**\n *\n */\n function resolveFloat(context: MockResolverContext): number {\n const key = `${context.parentType ?? 'value'}.${context.name ?? 'float'}`;\n return Number((next(key) * 1.25).toFixed(2));\n }\n\n /**\n *\n */\n function resolveBoolean(): boolean {\n return true;\n }\n\n /**\n *\n */\n function resolveDateTime(): string {\n const index = next('datetime');\n const value = new Date(baseDate + index * 86400000);\n return value.toISOString();\n }\n\n /**\n *\n */\n function resolveJson(context: MockResolverContext): { note: string } {\n const label = toLabel(context.parentType ?? 'Item');\n return { note: `Sample JSON for ${label}.` };\n }\n\n return {\n ID: resolveId,\n String: stringResolver,\n Int: resolveInt,\n Float: resolveFloat,\n Boolean: resolveBoolean,\n DateTime: resolveDateTime,\n JSON: resolveJson,\n };\n}\n"],"mappings":";AAKA,SAAS,EAAQ,GAAuB;CACtC,IAAM,IAAa,EAChB,QAAQ,sBAAsB,QAAQ,CACtC,QAAQ,UAAU,IAAI,CACtB,MAAM;CAIT,OAHI,MAAe,KACV,IAEF;;AAMT,SAAS,EAAO,GAAuB;CACrC,OAAO,EACJ,QAAQ,sBAAsB,QAAQ,CACtC,QAAQ,WAAW,IAAI,CACvB,aAAa;;AAMlB,SAAS,IAAyC;CAChD,IAAM,oBAAS,IAAI,KAAqB;CACxC,QAAQ,MAAgB;EACtB,IAAM,KAAQ,EAAO,IAAI,EAAI,IAAI,KAAK;EAEtC,OADA,EAAO,IAAI,GAAK,EAAK,EACd;;;AAIX,IAAM,IAAc;CAAC;CAAS;CAAU;CAAU;CAAU;CAAQ,EAC9D,IAAa;CAAC;CAAO;CAAU;CAAU;CAAU;CAAQ;AAKjE,SAAS,EAAS,GAAyB,GAAuB;CAKhE,OAJkB,GAAM,IAAQ,KAAK,EAAK,WAEjC;;AAQX,SAAgB,IAA+C;CAC7D,IAAM,IAAO,GAAe,EACtB,IAAW,KAAK,MAAM,2BAA2B;CAKvD,SAAS,EAAe,GAAsC;EAC5D,IAAM,IAAY,EAAQ,SAAS,EAAQ,QAAQ,SAC7C,IAAa,EAAQ,cAAc,QACnC,IAAQ,EAAQ,EAAW,EAE3B,IAAQ,EAAK,GADJ,EAAW,GAAG,IACN;EAEvB,QAAQ,GAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK,SACH,OAAO,GAAG,EAAM,GAAG;GACrB,KAAK,aACH,OAAO,EAAS,GAAa,EAAM;GACrC,KAAK,YACH,OAAO,EAAS,GAAY,EAAM;GACpC,KAAK,YACH,OAAO;GACT,KAAK,SACH,OAAO,OAAO,EAAM;GACtB,KAAK;GACL,KAAK,UACH,OAAO,GAAG,EAAO,EAAM,CAAC,GAAG;GAC7B,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,WACH,OAAO,uBAAuB,EAAO,EAAM,CAAC,GAAG;GACjD,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,WACH,OAAO,UAAU,EAAU,OAAO,EAAM;GAC1C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,wBACH,OAAO,UAAU,EAAU,OAAO,EAAM;GAC1C,SACE,OAAO,GAAG,EAAM,GAAG,EAAU,GAAG;;;CAOtC,SAAS,EAAU,GAAsC;EACvD,IAAM,IAAa,EAAQ,cAAc,QACnC,IAAQ,EAAK,GAAG,EAAW,KAAK;EACtC,OAAO,GAAG,EAAO,EAAW,CAAC,GAAG;;CAMlC,SAAS,EAAW,GAAsC;EAExD,OAAO,EAAK,GADG,EAAQ,cAAc,QAAQ,GAAG,EAAQ,QAAQ,QAChD;;CAMlB,SAAS,EAAa,GAAsC;EAC1D,IAAM,IAAM,GAAG,EAAQ,cAAc,QAAQ,GAAG,EAAQ,QAAQ;EAChE,OAAO,QAAQ,EAAK,EAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;;CAM9C,SAAS,IAA0B;EACjC,OAAO;;CAMT,SAAS,IAA0B;EACjC,IAAM,IAAQ,EAAK,WAAW;EAE9B,OAAO,IADW,KAAK,IAAW,IAAQ,MACnC,CAAM,aAAa;;CAM5B,SAAS,EAAY,GAAgD;EAEnE,OAAO,EAAE,MAAM,mBADD,EAAQ,EAAQ,cAAc,OACV,CAAM,IAAI;;CAG9C,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,KAAK;EACL,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;EACP"}
1
+ {"version":3,"file":"mockResolvers.js","names":[],"sources":["../../../../src/storybook/relay/mockResolvers.ts"],"sourcesContent":["import type { MockResolverContext, MockResolvers } from 'relay-test-utils';\n\n/**\n *\n */\nfunction toLabel(value: string): string {\n const withSpaces = value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n if (withSpaces === '') {\n return value;\n }\n return withSpaces;\n}\n\n/**\n *\n */\nfunction toSlug(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\n/**\n *\n */\nfunction createCounter(): (key: string) => number {\n const counts = new Map<string, number>();\n return (key: string) => {\n const next = (counts.get(key) ?? 0) + 1;\n counts.set(key, next);\n return next;\n };\n}\n\nconst FIRST_NAMES = ['Avery', 'Jordan', 'Taylor', 'Morgan', 'Casey'] as const;\nconst LAST_NAMES = ['Lee', 'Parker', 'Carter', 'Nguyen', 'Patel'] as const;\n\n/**\n *\n */\nfunction pickName(list: readonly string[], index: number): string {\n const candidate = list[(index - 1) % list.length];\n if (candidate == null) {\n return 'User';\n }\n return candidate;\n}\n\n/**\n *\n */\nexport function createBackofficeMockResolvers(): MockResolvers {\n const next = createCounter();\n const baseDate = Date.parse('2024-01-15T09:30:00.000Z');\n\n /**\n *\n */\n function stringResolver(context: MockResolverContext): string {\n const fieldName = context.alias ?? context.name ?? 'value';\n const parentType = context.parentType ?? 'Item';\n const label = toLabel(parentType);\n const key = `${parentType}.${fieldName}`;\n const index = next(key);\n\n switch (fieldName) {\n case 'name':\n case 'title':\n case 'label':\n return `${label} ${index}`;\n case 'firstName':\n return pickName(FIRST_NAMES, index);\n case 'lastName':\n return pickName(LAST_NAMES, index);\n case 'initials':\n return 'JD';\n case 'email':\n return `user${index}@example.com`;\n case 'slug':\n case 'handle':\n return `${toSlug(label)}-${index}`;\n case 'url':\n case 'uri':\n case 'avatarUrl':\n case 'imageUrl':\n case 'iconUrl':\n return `https://example.com/${toSlug(label)}/${index}`;\n case 'description':\n case 'summary':\n case 'content':\n case 'body':\n case 'notes':\n case 'message':\n return `Sample ${fieldName} for ${label}.`;\n case 'markdown':\n case 'summaryMarkdown':\n case 'notesForDev':\n case 'descriptionMarkdown':\n case 'suggestedFixMarkdown':\n return `Sample ${fieldName} for ${label}.`;\n default:\n return `${label} ${fieldName} ${index}`;\n }\n }\n\n /**\n *\n */\n function resolveId(context: MockResolverContext): string {\n const parentType = context.parentType ?? 'node';\n const index = next(`${parentType}.id`);\n return `${toSlug(parentType)}-${index}`;\n }\n\n /**\n *\n */\n function resolveInt(context: MockResolverContext): number {\n const key = `${context.parentType ?? 'value'}.${context.name ?? 'int'}`;\n return next(key);\n }\n\n /**\n *\n */\n function resolveFloat(context: MockResolverContext): number {\n const key = `${context.parentType ?? 'value'}.${context.name ?? 'float'}`;\n return Number((next(key) * 1.25).toFixed(2));\n }\n\n /**\n *\n */\n function resolveBoolean(): boolean {\n return true;\n }\n\n /**\n *\n */\n function resolveDateTime(): string {\n const index = next('datetime');\n const value = new Date(baseDate + index * 86400000);\n return value.toISOString();\n }\n\n /**\n *\n */\n function resolveJson(context: MockResolverContext): { note: string } {\n const label = toLabel(context.parentType ?? 'Item');\n return { note: `Sample JSON for ${label}.` };\n }\n\n return {\n ID: resolveId,\n String: stringResolver,\n Int: resolveInt,\n Float: resolveFloat,\n Boolean: resolveBoolean,\n DateTime: resolveDateTime,\n JSON: resolveJson,\n };\n}\n"],"mappings":";AAKA,SAAS,EAAQ,GAAuB;CACtC,IAAM,IAAa,EAChB,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,UAAU,GAAG,EACrB,KAAK;CAIR,OAHI,MAAe,KACV,IAEF;AACT;AAKA,SAAS,EAAO,GAAuB;CACrC,OAAO,EACJ,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB;AAKA,SAAS,IAAyC;CAChD,IAAM,oBAAS,IAAI,IAAoB;CACvC,QAAQ,MAAgB;EACtB,IAAM,KAAQ,EAAO,IAAI,CAAG,KAAK,KAAK;EAEtC,OADA,EAAO,IAAI,GAAK,CAAI,GACb;CACT;AACF;AAEA,IAAM,IAAc;CAAC;CAAS;CAAU;CAAU;CAAU;AAAO,GAC7D,IAAa;CAAC;CAAO;CAAU;CAAU;CAAU;AAAO;AAKhE,SAAS,EAAS,GAAyB,GAAuB;CAKhE,OAJkB,GAAM,IAAQ,KAAK,EAAK,WAEjC;AAGX;AAKA,SAAgB,IAA+C;CAC7D,IAAM,IAAO,EAAc,GACrB,IAAW,KAAK,MAAM,0BAA0B;CAKtD,SAAS,EAAe,GAAsC;EAC5D,IAAM,IAAY,EAAQ,SAAS,EAAQ,QAAQ,SAC7C,IAAa,EAAQ,cAAc,QACnC,IAAQ,EAAQ,CAAU,GAE1B,IAAQ,EAAK,GADJ,EAAW,GAAG,GACP;EAEtB,QAAQ,GAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK,SACH,OAAO,GAAG,EAAM,GAAG;GACrB,KAAK,aACH,OAAO,EAAS,GAAa,CAAK;GACpC,KAAK,YACH,OAAO,EAAS,GAAY,CAAK;GACnC,KAAK,YACH,OAAO;GACT,KAAK,SACH,OAAO,OAAO,EAAM;GACtB,KAAK;GACL,KAAK,UACH,OAAO,GAAG,EAAO,CAAK,EAAE,GAAG;GAC7B,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,WACH,OAAO,uBAAuB,EAAO,CAAK,EAAE,GAAG;GACjD,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,WACH,OAAO,UAAU,EAAU,OAAO,EAAM;GAC1C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,wBACH,OAAO,UAAU,EAAU,OAAO,EAAM;GAC1C,SACE,OAAO,GAAG,EAAM,GAAG,EAAU,GAAG;EACpC;CACF;CAKA,SAAS,EAAU,GAAsC;EACvD,IAAM,IAAa,EAAQ,cAAc,QACnC,IAAQ,EAAK,GAAG,EAAW,IAAI;EACrC,OAAO,GAAG,EAAO,CAAU,EAAE,GAAG;CAClC;CAKA,SAAS,EAAW,GAAsC;EAExD,OAAO,EAAK,GADG,EAAQ,cAAc,QAAQ,GAAG,EAAQ,QAAQ,OACjD;CACjB;CAKA,SAAS,EAAa,GAAsC;EAC1D,IAAM,IAAM,GAAG,EAAQ,cAAc,QAAQ,GAAG,EAAQ,QAAQ;EAChE,OAAO,QAAQ,EAAK,CAAG,IAAI,MAAM,QAAQ,CAAC,CAAC;CAC7C;CAKA,SAAS,IAA0B;EACjC,OAAO;CACT;CAKA,SAAS,IAA0B;EACjC,IAAM,IAAQ,EAAK,UAAU;EAE7B,OAAO,IADW,KAAK,IAAW,IAAQ,KACnC,EAAM,YAAY;CAC3B;CAKA,SAAS,EAAY,GAAgD;EAEnE,OAAO,EAAE,MAAM,mBADD,EAAQ,EAAQ,cAAc,MACV,EAAM,GAAG;CAC7C;CAEA,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,KAAK;EACL,OAAO;EACP,SAAS;EACT,UAAU;EACV,MAAM;CACR;AACF"}
package/lib/esm/style.css CHANGED
@@ -1,2 +1,2 @@
1
- .w8yhmy1:hover:not(:disabled){background-color:color-mix(in srgb, var(--_1ie8xnc59) 8%, transparent);color:var(--_1ie8xnc5a);border-color:var(--_1ie8xnc5a)}.oa1uye0{column-gap:var(--_1ie8xnc2f);grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:"content pickAction clearAction";width:100%;min-height:2.5rem}.oa1uye0:hover{background-color:var(--_1ie8xnc4l)}.oa1uye1{grid-area:content;min-height:100%}.oa1uye1:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.oa1uye1:disabled{cursor:not-allowed;opacity:.65}.oa1uye2:hover:not(:disabled){color:var(--_1ie8xnc4r);background-color:var(--_1ie8xnc4l)}.oa1uye2:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.oa1uye2:disabled{cursor:not-allowed;opacity:.65}.oa1uye3{grid-area:pickAction}.oa1uye4{grid-area:clearAction}.ds2thc0{min-width:3.75rem}.ds2thc1:hover:not(:disabled){color:var(--_1ie8xnc4r);background-color:var(--_1ie8xnc4l)}.ds2thc1:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.ds2thc1:disabled{cursor:not-allowed;opacity:.45}._13200uy0{grid-template-columns:minmax(0,1fr) repeat(4,minmax(0,auto))}.u4nszr0{min-height:92px}.u4nszr0:hover{border-color:var(--_1ie8xnc4u);background-color:var(--_1ie8xnc4l);transform:translateY(-1px)}.u4nszr0:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}._1xws1b00{color:var(--_1ie8xnc1bd)}._1xws1b00:hover:not(:disabled){background-color:var(--_1ie8xnc1be);color:var(--_1ie8xnc1bf)}._1xws1b00:focus-visible{box-shadow:var(--_1ie8xnc1bg);outline:none}._1xws1b00:disabled{cursor:not-allowed;opacity:.6}._1q232kj0{grid-template-columns:auto minmax(0,1fr);display:inline-grid}qbwcuem qbwcuek txvbqbyo5 txvbqbzlq txvbqb10iy txvbqbvv1 txvbqbdsb txvbqbey txvbqbjtp txvbqbfet txvbqbtcr txvbqb19c9 txvbqb196d txvbqb17u txvbqb2et txvbqb1w1 txvbqb2is txvbqbfd0 txvbqbm67 txvbqb3f txvbqb7g txvbqb75 txvbqb7t qbwcuel txvbqb1bw9 txvbqb1aeh txvbqb1b5d txvbqb1b7d qbwcue0 txvbqb1cb0 txvbqb1cws:hover .kk18lv0{color:var(--_1ie8xnc59)}@keyframes _11exksg0{0%{transform:translate(-120%)}60%{transform:translate(30%)}to{transform:translate(120%)}}._11exksg1{height:3px}._11exksg2{background:linear-gradient(90deg, var(--_1ie8xnc4f) 0%, var(--_1ie8xnc4e) 60%, var(--_1ie8xnc4f) 100%);animation:1.1s ease-in-out infinite _11exksg0}._8o9eh80:focus-visible{box-shadow:inset 0 0 0 2px var(--_1ie8xnc4e);outline:none}
1
+ .w8yhmy1:hover:not(:disabled){background-color:var(--_1ie8xnc5d);color:var(--_1ie8xnc5e);border-color:var(--_1ie8xnc5f)}.oa1uye0{column-gap:var(--_1ie8xnc2f);grid-template-columns:minmax(0,1fr) auto auto;grid-template-areas:"content pickAction clearAction";width:100%;min-height:2.5rem}.oa1uye0:hover{background-color:var(--_1ie8xnc4l)}.oa1uye1{grid-area:content;min-height:100%}.oa1uye1:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.oa1uye1:disabled{cursor:not-allowed;opacity:.65}.oa1uye2:hover:not(:disabled){color:var(--_1ie8xnc4r);background-color:var(--_1ie8xnc4l)}.oa1uye2:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.oa1uye2:disabled{cursor:not-allowed;opacity:.65}.oa1uye3{grid-area:pickAction}.oa1uye4{grid-area:clearAction}.ds2thc0{min-width:3.75rem}.ds2thc1:hover:not(:disabled){color:var(--_1ie8xnc4r);background-color:var(--_1ie8xnc4l)}.ds2thc1:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}.ds2thc1:disabled{cursor:not-allowed;opacity:.45}._13200uy0{grid-template-columns:minmax(0,1fr) repeat(4,minmax(0,auto))}.u4nszr0{min-height:92px}.u4nszr0:hover{border-color:var(--_1ie8xnc59);background-color:var(--_1ie8xnc4l);transform:translateY(-1px)}.u4nszr0:focus-visible{outline:2px solid var(--_1ie8xnc4e);outline-offset:2px}._1xws1b00{color:var(--_1ie8xnc1cl)}._1xws1b00:hover:not(:disabled){background-color:var(--_1ie8xnc1cm);color:var(--_1ie8xnc1cn)}._1xws1b00:focus-visible{box-shadow:var(--_1ie8xnc1co);outline:none}._1xws1b00:disabled{cursor:not-allowed;opacity:.6}@media screen and (width<=1023px){._1f81p5z0{grid-template-columns:minmax(0,1fr)}}._1q232kj0{grid-template-columns:auto minmax(0,1fr);display:inline-grid}qbwcuem qbwcuek txvbqb1084 txvbqb115p txvbqb122x txvbqbxf0 txvbqbfca txvbqbey txvbqbldo txvbqbgys txvbqbuwq txvbqb1b15 txvbqb1atl txvbqb1d9 txvbqb2pn txvbqb26v txvbqb2tm txvbqbgwz txvbqbnq6 txvbqb3f txvbqb7g txvbqb75 txvbqb7t qbwcuel txvbqb1e91 txvbqb1cbp txvbqb1dal txvbqb1dhx qbwcue0 txvbqb1etc txvbqb1fls:hover .kk18lv0{color:var(--_1ie8xnc63)}@keyframes _11exksg0{0%{transform:translate(-120%)}60%{transform:translate(30%)}to{transform:translate(120%)}}._11exksg1{height:3px}._11exksg2{background:var(--_1ie8xnc6l);animation:1.1s ease-in-out infinite _11exksg0}._8o9eh80:focus-visible{box-shadow:inset 0 0 0 2px var(--_1ie8xnc4e);outline:none}
2
2
  /*$vite$:1*/
@@ -1 +1 @@
1
- {"version":3,"file":"useCursorResumableSubscription.js","names":[],"sources":["../../../src/subscriptions/useCursorResumableSubscription.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\n\nimport { useConditionalSubscription } from '../hooks/useConditionalSubscription.js';\n\nexport type CursorSubscriptionControls = {\n markApplied: (cursor: unknown) => void;\n markNotApplied: (reason: string) => void;\n handleRefetchNeeded: (reason: string | null | undefined) => void;\n};\n\nexport type UseCursorResumableSubscriptionArgs<\n TSubscription extends OperationType,\n> = {\n enabled: boolean;\n identityKey: string | null | undefined;\n deps?: readonly unknown[];\n makeConfig: (\n controls: CursorSubscriptionControls,\n ) => GraphQLSubscriptionConfig<TSubscription>;\n makeVariables: (cursor: string | null) => TSubscription['variables'];\n onRefetchNeeded?: (reason: string | null) => void;\n};\n\nexport const useCursorResumableSubscription = <\n TSubscription extends OperationType,\n>({\n enabled,\n identityKey,\n deps,\n makeConfig,\n makeVariables,\n onRefetchNeeded,\n}: UseCursorResumableSubscriptionArgs<TSubscription>): void => {\n const lastCursorRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastCursorRef.current = null;\n }, [identityKey]);\n\n const controls = useMemo<CursorSubscriptionControls>(() => {\n return {\n markApplied: (cursor: unknown) => {\n if (typeof cursor === 'string') {\n lastCursorRef.current = cursor;\n }\n },\n markNotApplied: (reason: string) => {\n onRefetchNeeded?.(reason);\n },\n handleRefetchNeeded: (reason: string | null | undefined) => {\n onRefetchNeeded?.(reason ?? null);\n },\n };\n }, [onRefetchNeeded]);\n\n const config = useMemo(() => {\n return makeConfig(controls);\n }, [controls, makeConfig]);\n\n const getVariables = useCallback(() => {\n return makeVariables(lastCursorRef.current);\n }, [makeVariables]);\n\n useConditionalSubscription(config, {\n enabled,\n deps,\n getVariables,\n });\n};\n"],"mappings":";;;AAwBA,IAAa,KAEX,EACA,YACA,gBACA,SACA,eACA,kBACA,yBAC6D;CAC7D,IAAM,IAAgB,EAAsB,KAAK;CAEjD,QAAgB;EACd,EAAc,UAAU;IACvB,CAAC,EAAY,CAAC;CAEjB,IAAM,IAAW,SACR;EACL,cAAc,MAAoB;GAChC,AAAI,OAAO,KAAW,aACpB,EAAc,UAAU;;EAG5B,iBAAiB,MAAmB;GAClC,IAAkB,EAAO;;EAE3B,sBAAsB,MAAsC;GAC1D,IAAkB,KAAU,KAAK;;EAEpC,GACA,CAAC,EAAgB,CAAC;CAUrB,EARe,QACN,EAAW,EAAS,EAC1B,CAAC,GAAU,EAAW,CAME,EAAQ;EACjC;EACA;EACA,cAPmB,QACZ,EAAc,EAAc,QAAQ,EAC1C,CAAC,EAAc,CAKhB;EACD,CAAC"}
1
+ {"version":3,"file":"useCursorResumableSubscription.js","names":[],"sources":["../../../src/subscriptions/useCursorResumableSubscription.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { GraphQLSubscriptionConfig, OperationType } from 'relay-runtime';\n\nimport { useConditionalSubscription } from '../hooks/useConditionalSubscription.js';\n\nexport type CursorSubscriptionControls = {\n markApplied: (cursor: unknown) => void;\n markNotApplied: (reason: string) => void;\n handleRefetchNeeded: (reason: string | null | undefined) => void;\n};\n\nexport type UseCursorResumableSubscriptionArgs<\n TSubscription extends OperationType,\n> = {\n enabled: boolean;\n identityKey: string | null | undefined;\n deps?: readonly unknown[];\n makeConfig: (\n controls: CursorSubscriptionControls,\n ) => GraphQLSubscriptionConfig<TSubscription>;\n makeVariables: (cursor: string | null) => TSubscription['variables'];\n onRefetchNeeded?: (reason: string | null) => void;\n};\n\nexport const useCursorResumableSubscription = <\n TSubscription extends OperationType,\n>({\n enabled,\n identityKey,\n deps,\n makeConfig,\n makeVariables,\n onRefetchNeeded,\n}: UseCursorResumableSubscriptionArgs<TSubscription>): void => {\n const lastCursorRef = useRef<string | null>(null);\n\n useEffect(() => {\n lastCursorRef.current = null;\n }, [identityKey]);\n\n const controls = useMemo<CursorSubscriptionControls>(() => {\n return {\n markApplied: (cursor: unknown) => {\n if (typeof cursor === 'string') {\n lastCursorRef.current = cursor;\n }\n },\n markNotApplied: (reason: string) => {\n onRefetchNeeded?.(reason);\n },\n handleRefetchNeeded: (reason: string | null | undefined) => {\n onRefetchNeeded?.(reason ?? null);\n },\n };\n }, [onRefetchNeeded]);\n\n const config = useMemo(() => {\n return makeConfig(controls);\n }, [controls, makeConfig]);\n\n const getVariables = useCallback(() => {\n return makeVariables(lastCursorRef.current);\n }, [makeVariables]);\n\n useConditionalSubscription(config, {\n enabled,\n deps,\n getVariables,\n });\n};\n"],"mappings":";;;AAwBA,IAAa,KAEX,EACA,YACA,gBACA,SACA,eACA,kBACA,yBAC6D;CAC7D,IAAM,IAAgB,EAAsB,IAAI;CAEhD,QAAgB;EACd,EAAc,UAAU;CAC1B,GAAG,CAAC,CAAW,CAAC;CAEhB,IAAM,IAAW,SACR;EACL,cAAc,MAAoB;GAChC,AAAI,OAAO,KAAW,aACpB,EAAc,UAAU;EAE5B;EACA,iBAAiB,MAAmB;GAClC,IAAkB,CAAM;EAC1B;EACA,sBAAsB,MAAsC;GAC1D,IAAkB,KAAU,IAAI;EAClC;CACF,IACC,CAAC,CAAe,CAAC;CAUpB,EARe,QACN,EAAW,CAAQ,GACzB,CAAC,GAAU,CAAU,CAMG,GAAQ;EACjC;EACA;EACA,cAPmB,QACZ,EAAc,EAAc,OAAO,GACzC,CAAC,CAAa,CAKf;CACF,CAAC;AACH"}
@@ -1,4 +1,4 @@
1
- import type { StoryObj } from '@storybook/react';
1
+ import type { StoryObj } from '@storybook/react-vite';
2
2
  import { BackofficeErrorBoundary } from './BackofficeErrorBoundary.js';
3
3
  declare const meta: {
4
4
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeErrorBoundary.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/errors/BackofficeErrorBoundary.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAoDvE,QAAA,MAAM,IAAI;;;;CAIsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEtD,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC"}
1
+ {"version":3,"file":"BackofficeErrorBoundary.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/errors/BackofficeErrorBoundary.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AA0DvE,QAAA,MAAM,IAAI;;;;CAIsC,CAAC;AAEjD,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEtD,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeOverviewLayout.css.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/overview/backofficeOverviewLayout.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,OAAO,QAKlB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,KAAK,QAIhB,CAAC"}
1
+ {"version":3,"file":"backofficeOverviewLayout.css.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/overview/backofficeOverviewLayout.css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,OAAO,QAclB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,KAAK,QAIhB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeToolsDocPanel.css.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/tools/backofficeToolsDocPanel.css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAIrB,CAAC;AAEH,eAAO,MAAM,KAAK,QAOhB,CAAC;AAEH,eAAO,MAAM,OAAO,QAwBlB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAKtB,CAAC;AAEH,eAAO,MAAM,eAAe,QAE1B,CAAC;AAEH,eAAO,MAAM,OAAO,QAMlB,CAAC"}
1
+ {"version":3,"file":"backofficeToolsDocPanel.css.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/tools/backofficeToolsDocPanel.css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAIrB,CAAC;AAEH,eAAO,MAAM,KAAK,QAQhB,CAAC;AAEH,eAAO,MAAM,OAAO,QAwBlB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAKtB,CAAC;AAEH,eAAO,MAAM,eAAe,QAE1B,CAAC;AAEH,eAAO,MAAM,OAAO,QAQlB,CAAC"}