@knpkv/control-center 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/client/.vite/manifest.json +127 -125
  2. package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js → ActiveWorkPage-C6QwDV1Y.js} +2 -2
  3. package/dist/client/assets/{ActiveWorkPage-Bvji6Tys.js.map → ActiveWorkPage-C6QwDV1Y.js.map} +1 -1
  4. package/dist/client/assets/{AgentPage-Bom41la2.js → AgentPage-OqwP6uRi.js} +2 -2
  5. package/dist/client/assets/{AgentPage-Bom41la2.js.map → AgentPage-OqwP6uRi.js.map} +1 -1
  6. package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js → AtlassianOAuthCallbackPage-Bm7UhU-h.js} +2 -2
  7. package/dist/client/assets/{AtlassianOAuthCallbackPage-dr-B9-DD.js.map → AtlassianOAuthCallbackPage-Bm7UhU-h.js.map} +1 -1
  8. package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js → AuthorizedSharePage-DblP3USU.js} +2 -2
  9. package/dist/client/assets/{AuthorizedSharePage-C-P-PNfm.js.map → AuthorizedSharePage-DblP3USU.js.map} +1 -1
  10. package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js → BrowserCrypto-BGGRC6iW.js} +2 -2
  11. package/dist/client/assets/{BrowserCrypto-BPiuCuW-.js.map → BrowserCrypto-BGGRC6iW.js.map} +1 -1
  12. package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js → BrowserSessionHydrator-39UDbHf0.js} +2 -2
  13. package/dist/client/assets/{BrowserSessionHydrator-C8F_LGhg.js.map → BrowserSessionHydrator-39UDbHf0.js.map} +1 -1
  14. package/dist/client/assets/{CommandSearch-D6iFcdvj.js → CommandSearch-D4Fnjsl-.js} +2 -2
  15. package/dist/client/assets/{CommandSearch-D6iFcdvj.js.map → CommandSearch-D4Fnjsl-.js.map} +1 -1
  16. package/dist/client/assets/{ItemsPage-x39U11an.js → ItemsPage-BZQiTh9b.js} +2 -2
  17. package/dist/client/assets/{ItemsPage-x39U11an.js.map → ItemsPage-BZQiTh9b.js.map} +1 -1
  18. package/dist/client/assets/{PairPage-D5vlz4OG.js → PairPage-Dvfse5ky.js} +2 -2
  19. package/dist/client/assets/{PairPage-D5vlz4OG.js.map → PairPage-Dvfse5ky.js.map} +1 -1
  20. package/dist/client/assets/{PortfolioOverview-DSUabOmm.js → PortfolioOverview-DeJcfXcw.js} +2 -2
  21. package/dist/client/assets/{PortfolioOverview-DSUabOmm.js.map → PortfolioOverview-DeJcfXcw.js.map} +1 -1
  22. package/dist/client/assets/{ReleaseRoute-DyDm5s85.js → ReleaseRoute-D9q8_sCk.js} +2 -2
  23. package/dist/client/assets/{ReleaseRoute-DyDm5s85.js.map → ReleaseRoute-D9q8_sCk.js.map} +1 -1
  24. package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js +2 -0
  25. package/dist/client/assets/ReleaseWorkset-Bs_FXlbC.js.map +1 -0
  26. package/dist/client/assets/{ServicesPage-CoMVH2Si.js → ServicesPage-Co6GJHgc.js} +2 -2
  27. package/dist/client/assets/{ServicesPage-CoMVH2Si.js.map → ServicesPage-Co6GJHgc.js.map} +1 -1
  28. package/dist/client/assets/{TimelinePage-D8Fj_351.js → TimelinePage-CM2og72M.js} +2 -2
  29. package/dist/client/assets/{TimelinePage-D8Fj_351.js.map → TimelinePage-CM2og72M.js.map} +1 -1
  30. package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js → WorkspaceEntityLink-CTw_He-8.js} +2 -2
  31. package/dist/client/assets/{WorkspaceEntityLink-BRifdJHn.js.map → WorkspaceEntityLink-CTw_He-8.js.map} +1 -1
  32. package/dist/client/assets/{WorkspaceEntityRoute-BwpujSqk.css → WorkspaceEntityRoute-Bdmv6ki4.css} +1 -1
  33. package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js +30 -0
  34. package/dist/client/assets/WorkspaceEntityRoute-BnsmaeS2.js.map +1 -0
  35. package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js → WorkspaceReleaseLayout-Ba6keUju.js} +2 -2
  36. package/dist/client/assets/{WorkspaceReleaseLayout-DDLdY0rU.js.map → WorkspaceReleaseLayout-Ba6keUju.js.map} +1 -1
  37. package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js → authenticatedMutationClient-CJklf3iD.js} +2 -2
  38. package/dist/client/assets/{authenticatedMutationClient-D5yD0rch.js.map → authenticatedMutationClient-CJklf3iD.js.map} +1 -1
  39. package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js → authorizedShareTransport-Xg20SHJ5.js} +2 -2
  40. package/dist/client/assets/{authorizedShareTransport-Dyj53kJf.js.map → authorizedShareTransport-Xg20SHJ5.js.map} +1 -1
  41. package/dist/client/assets/{client-OmvShYdC.js → client-P7FaPwzJ.js} +2 -2
  42. package/dist/client/assets/{client-OmvShYdC.js.map → client-P7FaPwzJ.js.map} +1 -1
  43. package/dist/client/assets/{connectionTestTransport-c25QXx7A.js → connectionTestTransport-C9iPOkKM.js} +2 -2
  44. package/dist/client/assets/{connectionTestTransport-c25QXx7A.js.map → connectionTestTransport-C9iPOkKM.js.map} +1 -1
  45. package/dist/client/assets/{index-DLoOV6Hp.js → index-DpW_ckau.js} +3 -3
  46. package/dist/client/assets/{index-DLoOV6Hp.js.map → index-DpW_ckau.js.map} +1 -1
  47. package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js → patterns-DEbg7R-A-BhsMyh9D.js} +2 -2
  48. package/dist/client/assets/{patterns-DEbg7R-A-Cw0A2uKS.js.map → patterns-DEbg7R-A-BhsMyh9D.js.map} +1 -1
  49. package/dist/client/assets/{presentPortfolio-CkRqd_zz.js → presentPortfolio-D-v615bg.js} +2 -2
  50. package/dist/client/assets/{presentPortfolio-CkRqd_zz.js.map → presentPortfolio-D-v615bg.js.map} +1 -1
  51. package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js +2 -0
  52. package/dist/client/assets/presentWorkspaceItems-IAp5SnpB.js.map +1 -0
  53. package/dist/client/assets/{releaseRoutes-DSWkTh-E.js → releaseRoutes-CfaNElmG.js} +2 -2
  54. package/dist/client/assets/{releaseRoutes-DSWkTh-E.js.map → releaseRoutes-CfaNElmG.js.map} +1 -1
  55. package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js → serviceOnboarding-BZ2U_Ugw.js} +2 -2
  56. package/dist/client/assets/{serviceOnboarding-B9pvdyWf.js.map → serviceOnboarding-BZ2U_Ugw.js.map} +1 -1
  57. package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js → useWorkspaceItems-DQTYaq1R.js} +2 -2
  58. package/dist/client/assets/{useWorkspaceItems-D0FuHGto.js.map → useWorkspaceItems-DQTYaq1R.js.map} +1 -1
  59. package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js +2 -0
  60. package/dist/client/assets/workspaceEntityRoutes-Biw67kRR.js.map +1 -0
  61. package/dist/client/build-graph.json +32 -2
  62. package/dist/client/index.html +1 -1
  63. package/dist/server/api/deliveryGraph.d.ts +126 -0
  64. package/dist/server/api/deliveryGraph.d.ts.map +1 -1
  65. package/dist/server/api/index.js +2 -2
  66. package/dist/server/api/shares.d.ts +14 -0
  67. package/dist/server/api/shares.d.ts.map +1 -1
  68. package/dist/server/assets/{BindConfig-BjK10BEb.js → BindConfig-Dk3vjYZc.js} +7 -7
  69. package/dist/server/assets/{BindConfig-BjK10BEb.js.map → BindConfig-Dk3vjYZc.js.map} +1 -1
  70. package/dist/server/assets/{controlCenterApi-tZPvRPRH.js → controlCenterApi-Dsug4Rzi.js} +2 -2
  71. package/dist/server/assets/{controlCenterApi-tZPvRPRH.js.map → controlCenterApi-Dsug4Rzi.js.map} +1 -1
  72. package/dist/server/assets/{domainEvent-x7yeq-gU.js → domainEvent-CZLKMqgn.js} +13 -2
  73. package/dist/server/assets/{domainEvent-x7yeq-gU.js.map → domainEvent-CZLKMqgn.js.map} +1 -1
  74. package/dist/server/assets/{firstPartyServices-Y41P8uke.js → firstPartyServices-BWdrzdfD.js} +2 -2
  75. package/dist/server/assets/{firstPartyServices-Y41P8uke.js.map → firstPartyServices-BWdrzdfD.js.map} +1 -1
  76. package/dist/server/assets/{manualPluginSynchronization-C0aHB4UM.js → manualPluginSynchronization-CDnX9qXi.js} +64 -23
  77. package/dist/server/assets/manualPluginSynchronization-CDnX9qXi.js.map +1 -0
  78. package/dist/server/assets/{portfolioInvalidation-Ds9Xm4_P.js → portfolioInvalidation-iTUo5N4r.js} +26 -6
  79. package/dist/server/assets/portfolioInvalidation-iTUo5N4r.js.map +1 -0
  80. package/dist/server/assets/{readiness-CzU3vjYQ.js → readiness-CZBkcjLP.js} +2 -2
  81. package/dist/server/assets/{readiness-CzU3vjYQ.js.map → readiness-CZBkcjLP.js.map} +1 -1
  82. package/dist/server/build-graph.json +1 -0
  83. package/dist/server/domain/deliveryGraph.d.ts +14 -0
  84. package/dist/server/domain/deliveryGraph.d.ts.map +1 -1
  85. package/dist/server/domain/index.js +3 -3
  86. package/dist/server/index.js +4 -4
  87. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts +1 -1
  88. package/dist/server/server/application/normalizedPluginPageMaterialization.d.ts.map +1 -1
  89. package/dist/server/server/cli.js +4 -4
  90. package/dist/server/server/index.js +3 -3
  91. package/dist/server/server/persistence/Persistence.d.ts +35 -0
  92. package/dist/server/server/persistence/Persistence.d.ts.map +1 -1
  93. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts +56 -0
  94. package/dist/server/server/persistence/repositories/delivery-graph/contract.d.ts.map +1 -1
  95. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts +7 -0
  96. package/dist/server/server/persistence/repositories/delivery-graph/decode.d.ts.map +1 -1
  97. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts +35 -0
  98. package/dist/server/server/persistence/repositories/delivery-graph/read.d.ts.map +1 -1
  99. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts +7 -0
  100. package/dist/server/server/persistence/repositories/delivery-graph/rows.d.ts.map +1 -1
  101. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts +14 -0
  102. package/dist/server/server/persistence/repositories/delivery-graph/write.d.ts.map +1 -1
  103. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts +35 -0
  104. package/dist/server/server/persistence/repositories/deliveryGraphRepository.d.ts.map +1 -1
  105. package/package.json +3 -3
  106. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js +0 -2
  107. package/dist/client/assets/ReleaseWorkset-BhGacsgb.js.map +0 -1
  108. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js +0 -30
  109. package/dist/client/assets/WorkspaceEntityRoute-DPci8Q8I.js.map +0 -1
  110. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js +0 -2
  111. package/dist/client/assets/presentWorkspaceItems-BU__8LcC.js.map +0 -1
  112. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js +0 -2
  113. package/dist/client/assets/workspaceEntityRoutes-CRcfSq7c.js.map +0 -1
  114. package/dist/server/assets/manualPluginSynchronization-C0aHB4UM.js.map +0 -1
  115. package/dist/server/assets/portfolioInvalidation-Ds9Xm4_P.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,O as i,S as a,T as o,h as s,n as c,w as l}from"./Dialog-DwSIPb-B-DVn37afM.js";import{a as u,i as d}from"./releasePaths-s-fSbIM-.js";import{r as f,t as p}from"./PortfolioOverview-DSUabOmm.js";import{i as m,n as h,o as g,r as _}from"./releaseRoutes-DSWkTh-E.js";import{n as v}from"./useCompactReleasePreview-Ch3XxgJU.js";var y=e(t(),1),b={state:`_state_1or46_1`},x=n(),S=()=>(0,x.jsx)(`section`,{className:b.state,children:(0,x.jsx)(c,{action:(0,x.jsx)(s,{to:`/`,children:`Return to Control Center`}),description:`This workspace is unavailable to the current browser session. Check the address or return home.`,title:`Workspace not found`})}),C=(e,t)=>e._tag!==`ready`||e.portfolio.workspaceId===t,w=()=>{let e=f(),t=l(),n=r(),s=v(),c=(0,y.useRef)(null),b=i(),[w,T]=(0,y.useState)(null),E=_(b.workspaceId),D=o(`/w/:workspaceId/overview`)!==null,O=h(o(`/w/:workspaceId/releases/:releaseId/preview`)?.params.releaseId),k=E!==null&&O!==null&&e.state._tag===`ready`&&e.state.portfolio.releases.some(e=>e.id===O),A=D||k;if((0,y.useEffect)(()=>{w===null||E===null||e.state._tag!==`ready`||t.pathname!==d(E)||([...c.current?.querySelectorAll(`[data-portfolio-release-id]`)??[]].find(e=>e.dataset.portfolioReleaseId===w)?.querySelector(`button`)?.focus(),T(null))},[e.state,t.pathname,w,E]),E===null||!C(e.state,E))return(0,x.jsx)(S,{});let j=e=>{let r=m(E,e,g(t));n(u(E,e),{preventScrollReset:!0,state:r,viewTransition:!s})},M={controller:e,requestReleaseFocus:T,workspaceId:E};return(0,x.jsxs)(x.Fragment,{children:[A?(0,x.jsx)(`div`,{ref:c,children:(0,x.jsx)(p,{onPreviewRelease:j,onRetry:e.onRetry,previewPathForRelease:e=>u(E,e),state:e.state})}):null,(0,x.jsx)(a,{context:M})]})},T=()=>null,E=()=>{let e=_(i().workspaceId);return(0,x.jsx)(`section`,{className:b.state,children:(0,x.jsx)(c,{action:e===null?(0,x.jsx)(s,{to:`/`,children:`Return to Control Center`}):(0,x.jsx)(s,{to:d(e),children:`Open workspace overview`}),description:`The requested Control Center page does not exist.`,title:`Page not found`})})};export{E as WorkspaceNotFoundRoute,T as WorkspaceOverviewRoute,w as WorkspaceReleaseLayout};
2
- //# sourceMappingURL=WorkspaceReleaseLayout-DDLdY0rU.js.map
1
+ import{a as e,n as t,t as n}from"./jsx-runtime-n5LQ9ujS.js";import{E as r,O as i,S as a,T as o,h as s,n as c,w as l}from"./Dialog-DwSIPb-B-DVn37afM.js";import{a as u,i as d}from"./releasePaths-s-fSbIM-.js";import{r as f,t as p}from"./PortfolioOverview-DeJcfXcw.js";import{i as m,n as h,o as g,r as _}from"./releaseRoutes-CfaNElmG.js";import{n as v}from"./useCompactReleasePreview-Ch3XxgJU.js";var y=e(t(),1),b={state:`_state_1or46_1`},x=n(),S=()=>(0,x.jsx)(`section`,{className:b.state,children:(0,x.jsx)(c,{action:(0,x.jsx)(s,{to:`/`,children:`Return to Control Center`}),description:`This workspace is unavailable to the current browser session. Check the address or return home.`,title:`Workspace not found`})}),C=(e,t)=>e._tag!==`ready`||e.portfolio.workspaceId===t,w=()=>{let e=f(),t=l(),n=r(),s=v(),c=(0,y.useRef)(null),b=i(),[w,T]=(0,y.useState)(null),E=_(b.workspaceId),D=o(`/w/:workspaceId/overview`)!==null,O=h(o(`/w/:workspaceId/releases/:releaseId/preview`)?.params.releaseId),k=E!==null&&O!==null&&e.state._tag===`ready`&&e.state.portfolio.releases.some(e=>e.id===O),A=D||k;if((0,y.useEffect)(()=>{w===null||E===null||e.state._tag!==`ready`||t.pathname!==d(E)||([...c.current?.querySelectorAll(`[data-portfolio-release-id]`)??[]].find(e=>e.dataset.portfolioReleaseId===w)?.querySelector(`button`)?.focus(),T(null))},[e.state,t.pathname,w,E]),E===null||!C(e.state,E))return(0,x.jsx)(S,{});let j=e=>{let r=m(E,e,g(t));n(u(E,e),{preventScrollReset:!0,state:r,viewTransition:!s})},M={controller:e,requestReleaseFocus:T,workspaceId:E};return(0,x.jsxs)(x.Fragment,{children:[A?(0,x.jsx)(`div`,{ref:c,children:(0,x.jsx)(p,{onPreviewRelease:j,onRetry:e.onRetry,previewPathForRelease:e=>u(E,e),state:e.state})}):null,(0,x.jsx)(a,{context:M})]})},T=()=>null,E=()=>{let e=_(i().workspaceId);return(0,x.jsx)(`section`,{className:b.state,children:(0,x.jsx)(c,{action:e===null?(0,x.jsx)(s,{to:`/`,children:`Return to Control Center`}):(0,x.jsx)(s,{to:d(e),children:`Open workspace overview`}),description:`The requested Control Center page does not exist.`,title:`Page not found`})})};export{E as WorkspaceNotFoundRoute,T as WorkspaceOverviewRoute,w as WorkspaceReleaseLayout};
2
+ //# sourceMappingURL=WorkspaceReleaseLayout-Ba6keUju.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceReleaseLayout-DDLdY0rU.js","names":[],"sources":["../../../src/client/releases/WorkspaceReleaseLayout.module.css","../../../src/client/releases/WorkspaceReleaseLayout.tsx"],"sourcesContent":[".state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.state a {\n color: inherit;\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n","import { StatePanel } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { Link, Outlet, useLocation, useMatch, useNavigate, useParams } from \"react-router\"\n\nimport {\n PortfolioOverviewView,\n type PortfolioOverviewController,\n type PortfolioOverviewState,\n usePortfolioOverviewController\n} from \"../portfolio/PortfolioOverview.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport {\n decodeReleaseRouteId,\n decodeWorkspaceRouteId,\n makeReleaseRouteState,\n releaseOriginFromLocation,\n releaseParentPath,\n releasePreviewPath\n} from \"./releaseRoutes.js\"\nimport styles from \"./WorkspaceReleaseLayout.module.css\"\nimport { usePrefersReducedReleaseMotion } from \"./useCompactReleasePreview.js\"\n\nexport interface WorkspaceReleaseOutletContext {\n readonly controller: PortfolioOverviewController\n readonly requestReleaseFocus: (releaseId: PortfolioReleasePresentation[\"id\"]) => void\n readonly workspaceId: NonNullable<ReturnType<typeof decodeWorkspaceRouteId>>\n}\n\nconst WorkspaceNotFound = (): ReactElement => (\n <section className={styles.state}>\n <StatePanel\n action={<Link to=\"/\">Return to Control Center</Link>}\n description=\"This workspace is unavailable to the current browser session. Check the address or return home.\"\n title=\"Workspace not found\"\n />\n </section>\n)\n\nconst isMatchingWorkspace = (\n state: PortfolioOverviewState,\n workspaceId: NonNullable<ReturnType<typeof decodeWorkspaceRouteId>>\n): boolean => state._tag !== \"ready\" || state.portfolio.workspaceId === workspaceId\n\n/** Keep the canonical workspace overview mounted behind route-owned release previews. */\nexport const WorkspaceReleaseLayout = (): ReactElement => {\n const controller = usePortfolioOverviewController()\n const location = useLocation()\n const navigate = useNavigate()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n const overviewRef = useRef<HTMLDivElement>(null)\n const params = useParams()\n const [pendingReleaseFocus, setPendingReleaseFocus] = useState<PortfolioReleasePresentation[\"id\"] | null>(null)\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n const isOverview = useMatch(\"/w/:workspaceId/overview\") !== null\n const previewMatch = useMatch(\"/w/:workspaceId/releases/:releaseId/preview\")\n\n const previewReleaseId = decodeReleaseRouteId(previewMatch?.params.releaseId)\n const isKnownPreview =\n workspaceId !== null &&\n previewReleaseId !== null &&\n controller.state._tag === \"ready\" &&\n controller.state.portfolio.releases.some((release) => release.id === previewReleaseId)\n const shouldRenderPortfolio = isOverview || isKnownPreview\n\n useEffect(() => {\n if (\n pendingReleaseFocus === null ||\n workspaceId === null ||\n controller.state._tag !== \"ready\" ||\n location.pathname !== releaseParentPath(workspaceId)\n ) {\n return\n }\n const releaseEntry = [\n ...(overviewRef.current?.querySelectorAll<HTMLElement>(\"[data-portfolio-release-id]\") ?? [])\n ].find((entry) => entry.dataset.portfolioReleaseId === pendingReleaseFocus)\n releaseEntry?.querySelector<HTMLButtonElement>(\"button\")?.focus()\n setPendingReleaseFocus(null)\n }, [controller.state, location.pathname, pendingReleaseFocus, workspaceId])\n\n if (workspaceId === null || !isMatchingWorkspace(controller.state, workspaceId)) return <WorkspaceNotFound />\n\n const onPreviewRelease = (releaseId: PortfolioReleasePresentation[\"id\"]): void => {\n const state = makeReleaseRouteState(workspaceId, releaseId, releaseOriginFromLocation(location))\n navigate(releasePreviewPath(workspaceId, releaseId), {\n preventScrollReset: true,\n state,\n viewTransition: !prefersReducedMotion\n })\n }\n const outletContext = {\n controller,\n requestReleaseFocus: setPendingReleaseFocus,\n workspaceId\n } satisfies WorkspaceReleaseOutletContext\n\n return (\n <>\n {shouldRenderPortfolio ? (\n <div ref={overviewRef}>\n <PortfolioOverviewView\n onPreviewRelease={onPreviewRelease}\n onRetry={controller.onRetry}\n previewPathForRelease={(releaseId) => releasePreviewPath(workspaceId, releaseId)}\n state={controller.state}\n />\n </div>\n ) : null}\n <Outlet context={outletContext} />\n </>\n )\n}\n\n/** Render no extra content for the overview child because its layout owns the live view. */\nexport const WorkspaceOverviewRoute = (): null => null\n\n/** Keep an unknown workspace child URL stable instead of substituting another route. */\nexport const WorkspaceNotFoundRoute = (): ReactElement => {\n const params = useParams()\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n return (\n <section className={styles.state}>\n <StatePanel\n action={\n workspaceId === null ? (\n <Link to=\"/\">Return to Control Center</Link>\n ) : (\n <Link to={releaseParentPath(workspaceId)}>Open workspace overview</Link>\n )\n }\n description=\"The requested Control Center page does not exist.\"\n title=\"Page not found\"\n />\n </section>\n )\n}\n"],"mappings":"ybC4BM,OACJ,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,gBACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,aAAI,0BAA8B,CAAA,EACnD,YAAY,kGACZ,MAAM,qBACP,CAAA,CACM,CAAA,EAGL,GACJ,EACA,IACY,EAAM,OAAS,SAAW,EAAM,UAAU,cAAgB,EAG3D,MAA6C,CACxD,IAAM,EAAa,EAA+B,EAC5C,EAAW,EAAY,EACvB,EAAW,EAAY,EACvB,EAAuB,EAA+B,EACtD,GAAA,EAAA,EAAA,OAAA,CAAqC,IAAI,EACzC,EAAS,EAAU,EACnB,CAAC,EAAqB,IAAA,EAAA,EAAA,SAAA,CAA8E,IAAI,EACxG,EAAc,EAAuB,EAAO,WAAW,EACvD,EAAa,EAAS,0BAA0B,IAAM,KAGtD,EAAmB,EAFJ,EAAS,6CAEgB,CAAA,EAAc,OAAO,SAAS,EACtE,EACJ,IAAgB,MAChB,IAAqB,MACrB,EAAW,MAAM,OAAS,SAC1B,EAAW,MAAM,UAAU,SAAS,KAAM,GAAY,EAAQ,KAAO,CAAgB,EACjF,EAAwB,GAAc,EAkB5C,IAhBA,EAAA,EAAA,UAAA,KAAgB,CAEZ,IAAwB,MACxB,IAAgB,MAChB,EAAW,MAAM,OAAS,SAC1B,EAAS,WAAa,EAAkB,CAAW,IAOrD,CAFE,GAAI,EAAY,SAAS,iBAA8B,6BAA6B,GAAK,CAAC,CAC5F,CAAC,CAAC,KAAM,GAAU,EAAM,QAAQ,qBAAuB,CACvD,CAAA,EAAc,cAAiC,QAAQ,CAAC,EAAE,MAAM,EAChE,EAAuB,IAAI,EAC7B,EAAG,CAAC,EAAW,MAAO,EAAS,SAAU,EAAqB,CAAW,CAAC,EAEtE,IAAgB,MAAQ,CAAC,EAAoB,EAAW,MAAO,CAAW,EAAG,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAoB,CAAA,EAE5G,IAAM,EAAoB,GAAwD,CAChF,IAAM,EAAQ,EAAsB,EAAa,EAAW,EAA0B,CAAQ,CAAC,EAC/F,EAAS,EAAmB,EAAa,CAAS,EAAG,CACnD,mBAAoB,GACpB,QACA,eAAgB,CAAC,CACnB,CAAC,CACH,EACM,EAAgB,CACpB,aACA,oBAAqB,EACrB,aACF,EAEA,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,YACR,EAAA,EAAA,IAAA,CAAC,EAAD,CACoB,mBAClB,QAAS,EAAW,QACpB,sBAAwB,GAAc,EAAmB,EAAa,CAAS,EAC/E,MAAO,EAAW,KACnB,CAAA,CACE,CAAA,EACH,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,CAAgB,CAAA,CACjC,CAAA,CAAA,CAEN,EAGa,MAAqC,KAGrC,MAA6C,CAExD,IAAM,EAAc,EADL,EAC4B,CAAA,CAAO,WAAW,EAC7D,OACE,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,gBACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OACE,IAAgB,MACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,aAAI,0BAA8B,CAAA,GAE3C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAkB,CAAW,WAAG,yBAA6B,CAAA,EAG3E,YAAY,oDACZ,MAAM,gBACP,CAAA,CACM,CAAA,CAEb"}
1
+ {"version":3,"file":"WorkspaceReleaseLayout-Ba6keUju.js","names":[],"sources":["../../../src/client/releases/WorkspaceReleaseLayout.module.css","../../../src/client/releases/WorkspaceReleaseLayout.tsx"],"sourcesContent":[".state {\n display: grid;\n min-block-size: 60dvh;\n place-items: center;\n}\n\n.state a {\n color: inherit;\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n","import { StatePanel } from \"@knpkv/rly/primitives\"\nimport { type ReactElement, useEffect, useRef, useState } from \"react\"\nimport { Link, Outlet, useLocation, useMatch, useNavigate, useParams } from \"react-router\"\n\nimport {\n PortfolioOverviewView,\n type PortfolioOverviewController,\n type PortfolioOverviewState,\n usePortfolioOverviewController\n} from \"../portfolio/PortfolioOverview.js\"\nimport type { PortfolioReleasePresentation } from \"../portfolio/presentPortfolio.js\"\nimport {\n decodeReleaseRouteId,\n decodeWorkspaceRouteId,\n makeReleaseRouteState,\n releaseOriginFromLocation,\n releaseParentPath,\n releasePreviewPath\n} from \"./releaseRoutes.js\"\nimport styles from \"./WorkspaceReleaseLayout.module.css\"\nimport { usePrefersReducedReleaseMotion } from \"./useCompactReleasePreview.js\"\n\nexport interface WorkspaceReleaseOutletContext {\n readonly controller: PortfolioOverviewController\n readonly requestReleaseFocus: (releaseId: PortfolioReleasePresentation[\"id\"]) => void\n readonly workspaceId: NonNullable<ReturnType<typeof decodeWorkspaceRouteId>>\n}\n\nconst WorkspaceNotFound = (): ReactElement => (\n <section className={styles.state}>\n <StatePanel\n action={<Link to=\"/\">Return to Control Center</Link>}\n description=\"This workspace is unavailable to the current browser session. Check the address or return home.\"\n title=\"Workspace not found\"\n />\n </section>\n)\n\nconst isMatchingWorkspace = (\n state: PortfolioOverviewState,\n workspaceId: NonNullable<ReturnType<typeof decodeWorkspaceRouteId>>\n): boolean => state._tag !== \"ready\" || state.portfolio.workspaceId === workspaceId\n\n/** Keep the canonical workspace overview mounted behind route-owned release previews. */\nexport const WorkspaceReleaseLayout = (): ReactElement => {\n const controller = usePortfolioOverviewController()\n const location = useLocation()\n const navigate = useNavigate()\n const prefersReducedMotion = usePrefersReducedReleaseMotion()\n const overviewRef = useRef<HTMLDivElement>(null)\n const params = useParams()\n const [pendingReleaseFocus, setPendingReleaseFocus] = useState<PortfolioReleasePresentation[\"id\"] | null>(null)\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n const isOverview = useMatch(\"/w/:workspaceId/overview\") !== null\n const previewMatch = useMatch(\"/w/:workspaceId/releases/:releaseId/preview\")\n\n const previewReleaseId = decodeReleaseRouteId(previewMatch?.params.releaseId)\n const isKnownPreview =\n workspaceId !== null &&\n previewReleaseId !== null &&\n controller.state._tag === \"ready\" &&\n controller.state.portfolio.releases.some((release) => release.id === previewReleaseId)\n const shouldRenderPortfolio = isOverview || isKnownPreview\n\n useEffect(() => {\n if (\n pendingReleaseFocus === null ||\n workspaceId === null ||\n controller.state._tag !== \"ready\" ||\n location.pathname !== releaseParentPath(workspaceId)\n ) {\n return\n }\n const releaseEntry = [\n ...(overviewRef.current?.querySelectorAll<HTMLElement>(\"[data-portfolio-release-id]\") ?? [])\n ].find((entry) => entry.dataset.portfolioReleaseId === pendingReleaseFocus)\n releaseEntry?.querySelector<HTMLButtonElement>(\"button\")?.focus()\n setPendingReleaseFocus(null)\n }, [controller.state, location.pathname, pendingReleaseFocus, workspaceId])\n\n if (workspaceId === null || !isMatchingWorkspace(controller.state, workspaceId)) return <WorkspaceNotFound />\n\n const onPreviewRelease = (releaseId: PortfolioReleasePresentation[\"id\"]): void => {\n const state = makeReleaseRouteState(workspaceId, releaseId, releaseOriginFromLocation(location))\n navigate(releasePreviewPath(workspaceId, releaseId), {\n preventScrollReset: true,\n state,\n viewTransition: !prefersReducedMotion\n })\n }\n const outletContext = {\n controller,\n requestReleaseFocus: setPendingReleaseFocus,\n workspaceId\n } satisfies WorkspaceReleaseOutletContext\n\n return (\n <>\n {shouldRenderPortfolio ? (\n <div ref={overviewRef}>\n <PortfolioOverviewView\n onPreviewRelease={onPreviewRelease}\n onRetry={controller.onRetry}\n previewPathForRelease={(releaseId) => releasePreviewPath(workspaceId, releaseId)}\n state={controller.state}\n />\n </div>\n ) : null}\n <Outlet context={outletContext} />\n </>\n )\n}\n\n/** Render no extra content for the overview child because its layout owns the live view. */\nexport const WorkspaceOverviewRoute = (): null => null\n\n/** Keep an unknown workspace child URL stable instead of substituting another route. */\nexport const WorkspaceNotFoundRoute = (): ReactElement => {\n const params = useParams()\n const workspaceId = decodeWorkspaceRouteId(params.workspaceId)\n return (\n <section className={styles.state}>\n <StatePanel\n action={\n workspaceId === null ? (\n <Link to=\"/\">Return to Control Center</Link>\n ) : (\n <Link to={releaseParentPath(workspaceId)}>Open workspace overview</Link>\n )\n }\n description=\"The requested Control Center page does not exist.\"\n title=\"Page not found\"\n />\n </section>\n )\n}\n"],"mappings":"ybC4BM,OACJ,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,gBACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,aAAI,0BAA8B,CAAA,EACnD,YAAY,kGACZ,MAAM,qBACP,CAAA,CACM,CAAA,EAGL,GACJ,EACA,IACY,EAAM,OAAS,SAAW,EAAM,UAAU,cAAgB,EAG3D,MAA6C,CACxD,IAAM,EAAa,EAA+B,EAC5C,EAAW,EAAY,EACvB,EAAW,EAAY,EACvB,EAAuB,EAA+B,EACtD,GAAA,EAAA,EAAA,OAAA,CAAqC,IAAI,EACzC,EAAS,EAAU,EACnB,CAAC,EAAqB,IAAA,EAAA,EAAA,SAAA,CAA8E,IAAI,EACxG,EAAc,EAAuB,EAAO,WAAW,EACvD,EAAa,EAAS,0BAA0B,IAAM,KAGtD,EAAmB,EAFJ,EAAS,6CAEgB,CAAA,EAAc,OAAO,SAAS,EACtE,EACJ,IAAgB,MAChB,IAAqB,MACrB,EAAW,MAAM,OAAS,SAC1B,EAAW,MAAM,UAAU,SAAS,KAAM,GAAY,EAAQ,KAAO,CAAgB,EACjF,EAAwB,GAAc,EAkB5C,IAhBA,EAAA,EAAA,UAAA,KAAgB,CAEZ,IAAwB,MACxB,IAAgB,MAChB,EAAW,MAAM,OAAS,SAC1B,EAAS,WAAa,EAAkB,CAAW,IAOrD,CAFE,GAAI,EAAY,SAAS,iBAA8B,6BAA6B,GAAK,CAAC,CAC5F,CAAC,CAAC,KAAM,GAAU,EAAM,QAAQ,qBAAuB,CACvD,CAAA,EAAc,cAAiC,QAAQ,CAAC,EAAE,MAAM,EAChE,EAAuB,IAAI,EAC7B,EAAG,CAAC,EAAW,MAAO,EAAS,SAAU,EAAqB,CAAW,CAAC,EAEtE,IAAgB,MAAQ,CAAC,EAAoB,EAAW,MAAO,CAAW,EAAG,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAoB,CAAA,EAE5G,IAAM,EAAoB,GAAwD,CAChF,IAAM,EAAQ,EAAsB,EAAa,EAAW,EAA0B,CAAQ,CAAC,EAC/F,EAAS,EAAmB,EAAa,CAAS,EAAG,CACnD,mBAAoB,GACpB,QACA,eAAgB,CAAC,CACnB,CAAC,CACH,EACM,EAAgB,CACpB,aACA,oBAAqB,EACrB,aACF,EAEA,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,YACR,EAAA,EAAA,IAAA,CAAC,EAAD,CACoB,mBAClB,QAAS,EAAW,QACpB,sBAAwB,GAAc,EAAmB,EAAa,CAAS,EAC/E,MAAO,EAAW,KACnB,CAAA,CACE,CAAA,EACH,MACJ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,QAAS,CAAgB,CAAA,CACjC,CAAA,CAAA,CAEN,EAGa,MAAqC,KAGrC,MAA6C,CAExD,IAAM,EAAc,EADL,EAC4B,CAAA,CAAO,WAAW,EAC7D,OACE,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,gBACzB,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OACE,IAAgB,MACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,aAAI,0BAA8B,CAAA,GAE3C,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAkB,CAAW,WAAG,yBAA6B,CAAA,EAG3E,YAAY,oDACZ,MAAM,gBACP,CAAA,CACM,CAAA,CAEb"}
@@ -1,2 +1,2 @@
1
- import{N as e,Tt as t,c as n,f as r,it as i,lt as a,p as o,rt as s,st as c,t as l,xt as u}from"./client-OmvShYdC.js";var d=class extends t(`ForbiddenApiError`){},f=()=>u({try:()=>sessionStorage.getItem(`cc_csrf`),catch:()=>new d}).pipe(i(t=>t===null?s(new d):e(n)(t).pipe(a(()=>new d)))),p=c(function*(){let e=yield*f();return yield*l({transformClient:t=>t.pipe(r(o(`x-csrf-token`,e)))})});export{p as t};
2
- //# sourceMappingURL=authenticatedMutationClient-D5yD0rch.js.map
1
+ import{N as e,Tt as t,c as n,f as r,it as i,lt as a,p as o,rt as s,st as c,t as l,xt as u}from"./client-P7FaPwzJ.js";var d=class extends t(`ForbiddenApiError`){},f=()=>u({try:()=>sessionStorage.getItem(`cc_csrf`),catch:()=>new d}).pipe(i(t=>t===null?s(new d):e(n)(t).pipe(a(()=>new d)))),p=c(function*(){let e=yield*f();return yield*l({transformClient:t=>t.pipe(r(o(`x-csrf-token`,e)))})});export{p as t};
2
+ //# sourceMappingURL=authenticatedMutationClient-CJklf3iD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticatedMutationClient-D5yD0rch.js","names":[],"sources":["../../../src/client/authenticatedMutationClient.ts"],"sourcesContent":["import * as Data from \"effect/Data\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as HttpClient from \"effect/unstable/http/HttpClient\"\nimport * as HttpClientRequest from \"effect/unstable/http/HttpClientRequest\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { CsrfToken } from \"../api/session.js\"\n\nclass MutationProofUnavailable extends Data.TaggedError(\"ForbiddenApiError\") {}\n\nconst mutationProof = (): Effect.Effect<CsrfToken, MutationProofUnavailable> =>\n Effect.try({\n try: () => sessionStorage.getItem(\"cc_csrf\"),\n catch: () => new MutationProofUnavailable()\n }).pipe(\n Effect.flatMap((value) =>\n value === null\n ? Effect.fail(new MutationProofUnavailable())\n : Schema.decodeUnknownEffect(CsrfToken)(value).pipe(\n Effect.mapError(() => new MutationProofUnavailable())\n )\n )\n )\n\n/** Generated API client carrying the current tab's decoded mutation proof. */\nexport const makeAuthenticatedMutationClient = Effect.gen(function*() {\n const csrfToken = yield* mutationProof()\n return yield* makeControlCenterApiClient({\n transformClient: (httpClient) =>\n httpClient.pipe(HttpClient.mapRequest(HttpClientRequest.setHeader(\"x-csrf-token\", csrfToken)))\n })\n})\n"],"mappings":"qHASA,IAAM,EAAN,cAAuC,EAAiB,mBAAmB,CAAC,AAAC,CAAC,EAExE,MACJ,EAAW,CACT,QAAW,eAAe,QAAQ,SAAS,EAC3C,UAAa,IAAI,CACnB,CAAC,CAAC,CAAC,KACD,EAAgB,GACd,IAAU,KACN,EAAY,IAAI,CAA0B,EAC1C,EAA2B,CAAS,CAAC,CAAC,CAAK,CAAC,CAAC,KAC7C,MAAsB,IAAI,CAA0B,CACtD,CACJ,CACF,EAGW,EAAkC,EAAW,WAAY,CACpE,IAAM,EAAY,MAAO,EAAc,EACvC,OAAO,MAAO,EAA2B,CACvC,gBAAkB,GAChB,EAAW,KAAK,EAAsB,EAA4B,eAAgB,CAAS,CAAC,CAAC,CACjG,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"authenticatedMutationClient-CJklf3iD.js","names":[],"sources":["../../../src/client/authenticatedMutationClient.ts"],"sourcesContent":["import * as Data from \"effect/Data\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as HttpClient from \"effect/unstable/http/HttpClient\"\nimport * as HttpClientRequest from \"effect/unstable/http/HttpClientRequest\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { CsrfToken } from \"../api/session.js\"\n\nclass MutationProofUnavailable extends Data.TaggedError(\"ForbiddenApiError\") {}\n\nconst mutationProof = (): Effect.Effect<CsrfToken, MutationProofUnavailable> =>\n Effect.try({\n try: () => sessionStorage.getItem(\"cc_csrf\"),\n catch: () => new MutationProofUnavailable()\n }).pipe(\n Effect.flatMap((value) =>\n value === null\n ? Effect.fail(new MutationProofUnavailable())\n : Schema.decodeUnknownEffect(CsrfToken)(value).pipe(\n Effect.mapError(() => new MutationProofUnavailable())\n )\n )\n )\n\n/** Generated API client carrying the current tab's decoded mutation proof. */\nexport const makeAuthenticatedMutationClient = Effect.gen(function*() {\n const csrfToken = yield* mutationProof()\n return yield* makeControlCenterApiClient({\n transformClient: (httpClient) =>\n httpClient.pipe(HttpClient.mapRequest(HttpClientRequest.setHeader(\"x-csrf-token\", csrfToken)))\n })\n})\n"],"mappings":"qHASA,IAAM,EAAN,cAAuC,EAAiB,mBAAmB,CAAC,AAAC,CAAC,EAExE,MACJ,EAAW,CACT,QAAW,eAAe,QAAQ,SAAS,EAC3C,UAAa,IAAI,CACnB,CAAC,CAAC,CAAC,KACD,EAAgB,GACd,IAAU,KACN,EAAY,IAAI,CAA0B,EAC1C,EAA2B,CAAS,CAAC,CAAC,CAAK,CAAC,CAAC,KAC7C,MAAsB,IAAI,CAA0B,CACtD,CACJ,CACF,EAGW,EAAkC,EAAW,WAAY,CACpE,IAAM,EAAY,MAAO,EAAc,EACvC,OAAO,MAAO,EAA2B,CACvC,gBAAkB,GAChB,EAAW,KAAK,EAAsB,EAA4B,eAAgB,CAAS,CAAC,CAAC,CACjG,CAAC,CACH,CAAC"}
@@ -1,2 +1,2 @@
1
- import{C as e,G as t,N as n,X as r,at as i,dt as a,i as o,pt as s,st as c,t as l}from"./client-OmvShYdC.js";import{n as u,t as d}from"./BrowserCrypto-BPiuCuW-.js";import{t as f}from"./authenticatedMutationClient-D5yD0rch.js";var p=i(`AuthorizedShareTransport.expiresAtFor`)(function*(e){let n=yield*r;switch(e){case`hour`:return t(n,{hours:1});case`day`:return t(n,{days:1});case`week`:return t(n,{days:7})}}),m=c(function*(){let t=yield*(yield*u).randomUUIDv7;return yield*n(e)(t)}),h=i(`AuthorizedShareTransport.prepareCreate`)(function*(e){return{...e,expiresAt:yield*p(e.lifetime),shareId:yield*m}}),g={create:(e,t)=>s(c(function*(){return yield*(yield*f).shares.create({payload:{entityId:e.entityId,expiresAt:e.expiresAt,granteePersonId:e.granteePersonId,shareId:e.shareId}})}).pipe(a(o)),{signal:t}),prepareCreate:e=>s(h(e).pipe(a(d))),resolve:(e,t,n)=>s(c(function*(){return yield*(yield*l()).shares.resolve({params:{workspaceId:e,shareId:t}})}).pipe(a(o)),{signal:n}),revoke:(e,t,n)=>s(c(function*(){yield*(yield*f).shares.revoke({params:{workspaceId:e,shareId:t}})}).pipe(a(o)),{signal:n})};export{g as t};
2
- //# sourceMappingURL=authorizedShareTransport-Dyj53kJf.js.map
1
+ import{C as e,G as t,N as n,X as r,at as i,dt as a,i as o,pt as s,st as c,t as l}from"./client-P7FaPwzJ.js";import{n as u,t as d}from"./BrowserCrypto-BGGRC6iW.js";import{t as f}from"./authenticatedMutationClient-CJklf3iD.js";var p=i(`AuthorizedShareTransport.expiresAtFor`)(function*(e){let n=yield*r;switch(e){case`hour`:return t(n,{hours:1});case`day`:return t(n,{days:1});case`week`:return t(n,{days:7})}}),m=c(function*(){let t=yield*(yield*u).randomUUIDv7;return yield*n(e)(t)}),h=i(`AuthorizedShareTransport.prepareCreate`)(function*(e){return{...e,expiresAt:yield*p(e.lifetime),shareId:yield*m}}),g={create:(e,t)=>s(c(function*(){return yield*(yield*f).shares.create({payload:{entityId:e.entityId,expiresAt:e.expiresAt,granteePersonId:e.granteePersonId,shareId:e.shareId}})}).pipe(a(o)),{signal:t}),prepareCreate:e=>s(h(e).pipe(a(d))),resolve:(e,t,n)=>s(c(function*(){return yield*(yield*l()).shares.resolve({params:{workspaceId:e,shareId:t}})}).pipe(a(o)),{signal:n}),revoke:(e,t,n)=>s(c(function*(){yield*(yield*f).shares.revoke({params:{workspaceId:e,shareId:t}})}).pipe(a(o)),{signal:n})};export{g as t};
2
+ //# sourceMappingURL=authorizedShareTransport-Xg20SHJ5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorizedShareTransport-Dyj53kJf.js","names":[],"sources":["../../../src/client/items/authorizedShareTransport.ts"],"sourcesContent":["import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { AuthorizedShareResolution, AuthorizedShareSummary } from \"../../api/shares.js\"\nimport type { EntityId, PersonId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { ShareId as ShareIdSchema } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\nexport type AuthorizedShareLifetime = \"hour\" | \"day\" | \"week\"\n\n/** Exact share creation intent supplied to the generated browser transport. */\nexport interface PrepareAuthorizedShareTransportInput {\n readonly entityId: EntityId\n readonly granteePersonId: PersonId\n readonly lifetime: AuthorizedShareLifetime\n}\n\n/** Retry-stable share creation intent, including its original identity and expiry. */\nexport interface CreateAuthorizedShareTransportInput extends PrepareAuthorizedShareTransportInput {\n readonly expiresAt: UtcTimestamp\n readonly shareId: ShareId\n}\n\nconst expiresAtFor = Effect.fn(\"AuthorizedShareTransport.expiresAtFor\")(function*(lifetime: AuthorizedShareLifetime) {\n const now = yield* DateTime.now\n switch (lifetime) {\n case \"hour\":\n return DateTime.add(now, { hours: 1 })\n case \"day\":\n return DateTime.add(now, { days: 1 })\n case \"week\":\n return DateTime.add(now, { days: 7 })\n }\n})\n\nexport interface AuthorizedShareTransport {\n readonly create: (\n input: CreateAuthorizedShareTransportInput,\n signal: AbortSignal\n ) => Promise<AuthorizedShareSummary>\n readonly prepareCreate: (\n input: PrepareAuthorizedShareTransportInput\n ) => Promise<CreateAuthorizedShareTransportInput>\n readonly resolve: (\n workspaceId: WorkspaceId,\n shareId: ShareId,\n signal: AbortSignal\n ) => Promise<AuthorizedShareResolution>\n readonly revoke: (workspaceId: WorkspaceId, shareId: ShareId, signal: AbortSignal) => Promise<void>\n}\n\nconst makeShareId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(ShareIdSchema)(uuid)\n})\n\nconst prepareCreate = Effect.fn(\"AuthorizedShareTransport.prepareCreate\")(function*(\n input: PrepareAuthorizedShareTransportInput\n) {\n return {\n ...input,\n expiresAt: yield* expiresAtFor(input.lifetime),\n shareId: yield* makeShareId\n }\n})\n\n/** Generated-client transport for exact-scope authenticated entity shares. */\nexport const browserAuthorizedShareTransport: AuthorizedShareTransport = {\n create: (input, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.shares.create({\n payload: {\n entityId: input.entityId,\n expiresAt: input.expiresAt,\n granteePersonId: input.granteePersonId,\n shareId: input.shareId\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n prepareCreate: (input) => Effect.runPromise(prepareCreate(input).pipe(Effect.provide(BrowserCrypto.layer))),\n resolve: (workspaceId, shareId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.shares.resolve({ params: { workspaceId, shareId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n revoke: (workspaceId, shareId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n yield* client.shares.revoke({ params: { workspaceId, shareId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n"],"mappings":"iOA6BA,IAAM,EAAe,EAAU,uCAAuC,CAAC,CAAC,UAAU,EAAmC,CACnH,IAAM,EAAM,MAAO,EACnB,OAAQ,EAAR,CACE,IAAK,OACH,OAAO,EAAa,EAAK,CAAE,MAAO,CAAE,CAAC,EACvC,IAAK,MACH,OAAO,EAAa,EAAK,CAAE,KAAM,CAAE,CAAC,EACtC,IAAK,OACH,OAAO,EAAa,EAAK,CAAE,KAAM,CAAE,CAAC,CACxC,CACF,CAAC,EAkBK,EAAc,EAAW,WAAY,CAEzC,IAAM,EAAO,OAAO,MADS,EAAA,CACK,aAClC,OAAO,MAAO,EAA2B,CAAa,CAAC,CAAC,CAAI,CAC9D,CAAC,EAEK,EAAgB,EAAU,wCAAwC,CAAC,CAAC,UACxE,EACA,CACA,MAAO,CACL,GAAG,EACH,UAAW,MAAO,EAAa,EAAM,QAAQ,EAC7C,QAAS,MAAO,CAClB,CACF,CAAC,EAGY,EAA4D,CACvE,QAAS,EAAO,IACd,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAAA,CACD,OAAO,OAAO,CACjC,QAAS,CACP,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,gBAAiB,EAAM,gBACvB,QAAS,EAAM,OACjB,CACF,CAAC,CACH,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,EACF,cAAgB,GAAU,EAAkB,EAAc,CAAK,CAAC,CAAC,KAAK,EAAe,CAAmB,CAAC,CAAC,EAC1G,SAAU,EAAa,EAAS,IAC9B,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,OAAO,QAAQ,CAAE,OAAQ,CAAE,cAAa,SAAQ,CAAE,CAAC,CAC1E,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,EACF,QAAS,EAAa,EAAS,IAC7B,EACE,EAAW,WAAY,CAErB,OAAO,MADe,EAAA,CACR,OAAO,OAAO,CAAE,OAAQ,CAAE,cAAa,SAAQ,CAAE,CAAC,CAClE,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ"}
1
+ {"version":3,"file":"authorizedShareTransport-Xg20SHJ5.js","names":[],"sources":["../../../src/client/items/authorizedShareTransport.ts"],"sourcesContent":["import * as BrowserCrypto from \"@effect/platform-browser/BrowserCrypto\"\nimport * as Crypto from \"effect/Crypto\"\nimport * as DateTime from \"effect/DateTime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\n\nimport { makeControlCenterApiClient } from \"../../api/client.js\"\nimport type { AuthorizedShareResolution, AuthorizedShareSummary } from \"../../api/shares.js\"\nimport type { EntityId, PersonId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { ShareId as ShareIdSchema } from \"../../domain/identifiers.js\"\nimport type { UtcTimestamp } from \"../../domain/utcTimestamp.js\"\nimport { makeAuthenticatedMutationClient } from \"../authenticatedMutationClient.js\"\n\nexport type AuthorizedShareLifetime = \"hour\" | \"day\" | \"week\"\n\n/** Exact share creation intent supplied to the generated browser transport. */\nexport interface PrepareAuthorizedShareTransportInput {\n readonly entityId: EntityId\n readonly granteePersonId: PersonId\n readonly lifetime: AuthorizedShareLifetime\n}\n\n/** Retry-stable share creation intent, including its original identity and expiry. */\nexport interface CreateAuthorizedShareTransportInput extends PrepareAuthorizedShareTransportInput {\n readonly expiresAt: UtcTimestamp\n readonly shareId: ShareId\n}\n\nconst expiresAtFor = Effect.fn(\"AuthorizedShareTransport.expiresAtFor\")(function*(lifetime: AuthorizedShareLifetime) {\n const now = yield* DateTime.now\n switch (lifetime) {\n case \"hour\":\n return DateTime.add(now, { hours: 1 })\n case \"day\":\n return DateTime.add(now, { days: 1 })\n case \"week\":\n return DateTime.add(now, { days: 7 })\n }\n})\n\nexport interface AuthorizedShareTransport {\n readonly create: (\n input: CreateAuthorizedShareTransportInput,\n signal: AbortSignal\n ) => Promise<AuthorizedShareSummary>\n readonly prepareCreate: (\n input: PrepareAuthorizedShareTransportInput\n ) => Promise<CreateAuthorizedShareTransportInput>\n readonly resolve: (\n workspaceId: WorkspaceId,\n shareId: ShareId,\n signal: AbortSignal\n ) => Promise<AuthorizedShareResolution>\n readonly revoke: (workspaceId: WorkspaceId, shareId: ShareId, signal: AbortSignal) => Promise<void>\n}\n\nconst makeShareId = Effect.gen(function*() {\n const cryptoService = yield* Crypto.Crypto\n const uuid = yield* cryptoService.randomUUIDv7\n return yield* Schema.decodeUnknownEffect(ShareIdSchema)(uuid)\n})\n\nconst prepareCreate = Effect.fn(\"AuthorizedShareTransport.prepareCreate\")(function*(\n input: PrepareAuthorizedShareTransportInput\n) {\n return {\n ...input,\n expiresAt: yield* expiresAtFor(input.lifetime),\n shareId: yield* makeShareId\n }\n})\n\n/** Generated-client transport for exact-scope authenticated entity shares. */\nexport const browserAuthorizedShareTransport: AuthorizedShareTransport = {\n create: (input, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n return yield* client.shares.create({\n payload: {\n entityId: input.entityId,\n expiresAt: input.expiresAt,\n granteePersonId: input.granteePersonId,\n shareId: input.shareId\n }\n })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n prepareCreate: (input) => Effect.runPromise(prepareCreate(input).pipe(Effect.provide(BrowserCrypto.layer))),\n resolve: (workspaceId, shareId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeControlCenterApiClient()\n return yield* client.shares.resolve({ params: { workspaceId, shareId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n ),\n revoke: (workspaceId, shareId, signal) =>\n Effect.runPromise(\n Effect.gen(function*() {\n const client = yield* makeAuthenticatedMutationClient\n yield* client.shares.revoke({ params: { workspaceId, shareId } })\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n { signal }\n )\n}\n"],"mappings":"iOA6BA,IAAM,EAAe,EAAU,uCAAuC,CAAC,CAAC,UAAU,EAAmC,CACnH,IAAM,EAAM,MAAO,EACnB,OAAQ,EAAR,CACE,IAAK,OACH,OAAO,EAAa,EAAK,CAAE,MAAO,CAAE,CAAC,EACvC,IAAK,MACH,OAAO,EAAa,EAAK,CAAE,KAAM,CAAE,CAAC,EACtC,IAAK,OACH,OAAO,EAAa,EAAK,CAAE,KAAM,CAAE,CAAC,CACxC,CACF,CAAC,EAkBK,EAAc,EAAW,WAAY,CAEzC,IAAM,EAAO,OAAO,MADS,EAAA,CACK,aAClC,OAAO,MAAO,EAA2B,CAAa,CAAC,CAAC,CAAI,CAC9D,CAAC,EAEK,EAAgB,EAAU,wCAAwC,CAAC,CAAC,UACxE,EACA,CACA,MAAO,CACL,GAAG,EACH,UAAW,MAAO,EAAa,EAAM,QAAQ,EAC7C,QAAS,MAAO,CAClB,CACF,CAAC,EAGY,EAA4D,CACvE,QAAS,EAAO,IACd,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAAA,CACD,OAAO,OAAO,CACjC,QAAS,CACP,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,gBAAiB,EAAM,gBACvB,QAAS,EAAM,OACjB,CACF,CAAC,CACH,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,EACF,cAAgB,GAAU,EAAkB,EAAc,CAAK,CAAC,CAAC,KAAK,EAAe,CAAmB,CAAC,CAAC,EAC1G,SAAU,EAAa,EAAS,IAC9B,EACE,EAAW,WAAY,CAErB,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,OAAO,QAAQ,CAAE,OAAQ,CAAE,cAAa,SAAQ,CAAE,CAAC,CAC1E,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,EACF,QAAS,EAAa,EAAS,IAC7B,EACE,EAAW,WAAY,CAErB,OAAO,MADe,EAAA,CACR,OAAO,OAAO,CAAE,OAAQ,CAAE,cAAa,SAAQ,CAAE,CAAC,CAClE,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,EAC7C,CAAE,QAAO,CACX,CACJ"}