@contember/react-identity 1.3.0-alpha.14

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 (178) hide show
  1. package/dist/development/components/HasRole.cjs +24 -0
  2. package/dist/development/components/HasRole.cjs.map +1 -0
  3. package/dist/development/components/HasRole.js +24 -0
  4. package/dist/development/components/HasRole.js.map +1 -0
  5. package/dist/development/components/IdentityProvider.cjs +27 -0
  6. package/dist/development/components/IdentityProvider.cjs.map +1 -0
  7. package/dist/development/components/IdentityProvider.js +27 -0
  8. package/dist/development/components/IdentityProvider.js.map +1 -0
  9. package/dist/development/components/IdentityState.cjs +9 -0
  10. package/dist/development/components/IdentityState.cjs.map +1 -0
  11. package/dist/development/components/IdentityState.js +9 -0
  12. package/dist/development/components/IdentityState.js.map +1 -0
  13. package/dist/development/components/LogoutTrigger.cjs +12 -0
  14. package/dist/development/components/LogoutTrigger.cjs.map +1 -0
  15. package/dist/development/components/LogoutTrigger.js +12 -0
  16. package/dist/development/components/LogoutTrigger.js.map +1 -0
  17. package/dist/development/environment/IdentityEnvironmentExtension.cjs +13 -0
  18. package/dist/development/environment/IdentityEnvironmentExtension.cjs.map +1 -0
  19. package/dist/development/environment/IdentityEnvironmentExtension.js +13 -0
  20. package/dist/development/environment/IdentityEnvironmentExtension.js.map +1 -0
  21. package/dist/development/environment/ProjectEnvironmentExtension.cjs +13 -0
  22. package/dist/development/environment/ProjectEnvironmentExtension.cjs.map +1 -0
  23. package/dist/development/environment/ProjectEnvironmentExtension.js +13 -0
  24. package/dist/development/environment/ProjectEnvironmentExtension.js.map +1 -0
  25. package/dist/development/hooks/useFetchIdentity.cjs +51 -0
  26. package/dist/development/hooks/useFetchIdentity.cjs.map +1 -0
  27. package/dist/development/hooks/useFetchIdentity.js +51 -0
  28. package/dist/development/hooks/useFetchIdentity.js.map +1 -0
  29. package/dist/development/hooks/useLogout.cjs +10 -0
  30. package/dist/development/hooks/useLogout.cjs.map +1 -0
  31. package/dist/development/hooks/useLogout.js +10 -0
  32. package/dist/development/hooks/useLogout.js.map +1 -0
  33. package/dist/development/hooks/useProjectUserRoles.cjs +21 -0
  34. package/dist/development/hooks/useProjectUserRoles.cjs.map +1 -0
  35. package/dist/development/hooks/useProjectUserRoles.js +21 -0
  36. package/dist/development/hooks/useProjectUserRoles.js.map +1 -0
  37. package/dist/development/index.cjs +25 -0
  38. package/dist/development/index.cjs.map +1 -0
  39. package/dist/development/index.js +25 -0
  40. package/dist/development/index.js.map +1 -0
  41. package/dist/development/internal/contexts.cjs +13 -0
  42. package/dist/development/internal/contexts.cjs.map +1 -0
  43. package/dist/development/internal/contexts.js +13 -0
  44. package/dist/development/internal/contexts.js.map +1 -0
  45. package/dist/development/internal/hooks/useFetchMe.cjs +32 -0
  46. package/dist/development/internal/hooks/useFetchMe.cjs.map +1 -0
  47. package/dist/development/internal/hooks/useFetchMe.js +15 -0
  48. package/dist/development/internal/hooks/useFetchMe.js.map +1 -0
  49. package/dist/development/internal/hooks/useLogoutInternal.cjs +35 -0
  50. package/dist/development/internal/hooks/useLogoutInternal.cjs.map +1 -0
  51. package/dist/development/internal/hooks/useLogoutInternal.js +35 -0
  52. package/dist/development/internal/hooks/useLogoutInternal.js.map +1 -0
  53. package/dist/development/internal/hooks/useSignOut.cjs +30 -0
  54. package/dist/development/internal/hooks/useSignOut.cjs.map +1 -0
  55. package/dist/development/internal/hooks/useSignOut.js +13 -0
  56. package/dist/development/internal/hooks/useSignOut.js.map +1 -0
  57. package/dist/production/components/HasRole.cjs +24 -0
  58. package/dist/production/components/HasRole.cjs.map +1 -0
  59. package/dist/production/components/HasRole.js +24 -0
  60. package/dist/production/components/HasRole.js.map +1 -0
  61. package/dist/production/components/IdentityProvider.cjs +27 -0
  62. package/dist/production/components/IdentityProvider.cjs.map +1 -0
  63. package/dist/production/components/IdentityProvider.js +27 -0
  64. package/dist/production/components/IdentityProvider.js.map +1 -0
  65. package/dist/production/components/IdentityState.cjs +9 -0
  66. package/dist/production/components/IdentityState.cjs.map +1 -0
  67. package/dist/production/components/IdentityState.js +9 -0
  68. package/dist/production/components/IdentityState.js.map +1 -0
  69. package/dist/production/components/LogoutTrigger.cjs +12 -0
  70. package/dist/production/components/LogoutTrigger.cjs.map +1 -0
  71. package/dist/production/components/LogoutTrigger.js +12 -0
  72. package/dist/production/components/LogoutTrigger.js.map +1 -0
  73. package/dist/production/environment/IdentityEnvironmentExtension.cjs +13 -0
  74. package/dist/production/environment/IdentityEnvironmentExtension.cjs.map +1 -0
  75. package/dist/production/environment/IdentityEnvironmentExtension.js +13 -0
  76. package/dist/production/environment/IdentityEnvironmentExtension.js.map +1 -0
  77. package/dist/production/environment/ProjectEnvironmentExtension.cjs +13 -0
  78. package/dist/production/environment/ProjectEnvironmentExtension.cjs.map +1 -0
  79. package/dist/production/environment/ProjectEnvironmentExtension.js +13 -0
  80. package/dist/production/environment/ProjectEnvironmentExtension.js.map +1 -0
  81. package/dist/production/hooks/useFetchIdentity.cjs +51 -0
  82. package/dist/production/hooks/useFetchIdentity.cjs.map +1 -0
  83. package/dist/production/hooks/useFetchIdentity.js +51 -0
  84. package/dist/production/hooks/useFetchIdentity.js.map +1 -0
  85. package/dist/production/hooks/useLogout.cjs +10 -0
  86. package/dist/production/hooks/useLogout.cjs.map +1 -0
  87. package/dist/production/hooks/useLogout.js +10 -0
  88. package/dist/production/hooks/useLogout.js.map +1 -0
  89. package/dist/production/hooks/useProjectUserRoles.cjs +21 -0
  90. package/dist/production/hooks/useProjectUserRoles.cjs.map +1 -0
  91. package/dist/production/hooks/useProjectUserRoles.js +21 -0
  92. package/dist/production/hooks/useProjectUserRoles.js.map +1 -0
  93. package/dist/production/index.cjs +25 -0
  94. package/dist/production/index.cjs.map +1 -0
  95. package/dist/production/index.js +25 -0
  96. package/dist/production/index.js.map +1 -0
  97. package/dist/production/internal/contexts.cjs +13 -0
  98. package/dist/production/internal/contexts.cjs.map +1 -0
  99. package/dist/production/internal/contexts.js +13 -0
  100. package/dist/production/internal/contexts.js.map +1 -0
  101. package/dist/production/internal/hooks/useFetchMe.cjs +32 -0
  102. package/dist/production/internal/hooks/useFetchMe.cjs.map +1 -0
  103. package/dist/production/internal/hooks/useFetchMe.js +15 -0
  104. package/dist/production/internal/hooks/useFetchMe.js.map +1 -0
  105. package/dist/production/internal/hooks/useLogoutInternal.cjs +35 -0
  106. package/dist/production/internal/hooks/useLogoutInternal.cjs.map +1 -0
  107. package/dist/production/internal/hooks/useLogoutInternal.js +35 -0
  108. package/dist/production/internal/hooks/useLogoutInternal.js.map +1 -0
  109. package/dist/production/internal/hooks/useSignOut.cjs +30 -0
  110. package/dist/production/internal/hooks/useSignOut.cjs.map +1 -0
  111. package/dist/production/internal/hooks/useSignOut.js +13 -0
  112. package/dist/production/internal/hooks/useSignOut.js.map +1 -0
  113. package/dist/types/components/HasRole.d.ts +11 -0
  114. package/dist/types/components/HasRole.d.ts.map +1 -0
  115. package/dist/types/components/IdentityProvider.d.ts +6 -0
  116. package/dist/types/components/IdentityProvider.d.ts.map +1 -0
  117. package/dist/types/components/IdentityState.d.ts +8 -0
  118. package/dist/types/components/IdentityState.d.ts.map +1 -0
  119. package/dist/types/components/LogoutTrigger.d.ts +5 -0
  120. package/dist/types/components/LogoutTrigger.d.ts.map +1 -0
  121. package/dist/types/components/index.d.ts +5 -0
  122. package/dist/types/components/index.d.ts.map +1 -0
  123. package/dist/types/environment/IdentityEnvironmentExtension.d.ts +6 -0
  124. package/dist/types/environment/IdentityEnvironmentExtension.d.ts.map +1 -0
  125. package/dist/types/environment/ProjectEnvironmentExtension.d.ts +5 -0
  126. package/dist/types/environment/ProjectEnvironmentExtension.d.ts.map +1 -0
  127. package/dist/types/environment/index.d.ts +3 -0
  128. package/dist/types/environment/index.d.ts.map +1 -0
  129. package/dist/types/hooks/index.d.ts +5 -0
  130. package/dist/types/hooks/index.d.ts.map +1 -0
  131. package/dist/types/hooks/useFetchIdentity.d.ts +6 -0
  132. package/dist/types/hooks/useFetchIdentity.d.ts.map +1 -0
  133. package/dist/types/hooks/useLogout.d.ts +4 -0
  134. package/dist/types/hooks/useLogout.d.ts.map +1 -0
  135. package/dist/types/hooks/useProjectUserRoles.d.ts +3 -0
  136. package/dist/types/hooks/useProjectUserRoles.d.ts.map +1 -0
  137. package/dist/types/index.d.ts +5 -0
  138. package/dist/types/index.d.ts.map +1 -0
  139. package/dist/types/internal/contexts.d.ts +7 -0
  140. package/dist/types/internal/contexts.d.ts.map +1 -0
  141. package/dist/types/internal/hooks/useFetchMe.d.ts +94 -0
  142. package/dist/types/internal/hooks/useFetchMe.d.ts.map +1 -0
  143. package/dist/types/internal/hooks/useLogoutInternal.d.ts +4 -0
  144. package/dist/types/internal/hooks/useLogoutInternal.d.ts.map +1 -0
  145. package/dist/types/internal/hooks/useSignOut.d.ts +26 -0
  146. package/dist/types/internal/hooks/useSignOut.d.ts.map +1 -0
  147. package/dist/types/tsconfig.tsbuildinfo +1 -0
  148. package/dist/types/types/Identity.d.ts +19 -0
  149. package/dist/types/types/Identity.d.ts.map +1 -0
  150. package/dist/types/types/IdentityMethods.d.ts +5 -0
  151. package/dist/types/types/IdentityMethods.d.ts.map +1 -0
  152. package/dist/types/types/IdentityStateValue.d.ts +2 -0
  153. package/dist/types/types/IdentityStateValue.d.ts.map +1 -0
  154. package/dist/types/types/index.d.ts +4 -0
  155. package/dist/types/types/index.d.ts.map +1 -0
  156. package/package.json +58 -0
  157. package/src/components/HasRole.tsx +33 -0
  158. package/src/components/IdentityProvider.tsx +40 -0
  159. package/src/components/IdentityState.tsx +14 -0
  160. package/src/components/LogoutTrigger.tsx +10 -0
  161. package/src/components/index.ts +4 -0
  162. package/src/environment/IdentityEnvironmentExtension.ts +12 -0
  163. package/src/environment/ProjectEnvironmentExtension.tsx +10 -0
  164. package/src/environment/index.ts +2 -0
  165. package/src/hooks/index.ts +8 -0
  166. package/src/hooks/useFetchIdentity.ts +54 -0
  167. package/src/hooks/useLogout.ts +7 -0
  168. package/src/hooks/useProjectUserRoles.tsx +21 -0
  169. package/src/index.ts +4 -0
  170. package/src/internal/contexts.ts +8 -0
  171. package/src/internal/hooks/useFetchMe.ts +21 -0
  172. package/src/internal/hooks/useLogoutInternal.ts +35 -0
  173. package/src/internal/hooks/useSignOut.ts +13 -0
  174. package/src/tsconfig.json +12 -0
  175. package/src/types/Identity.ts +20 -0
  176. package/src/types/IdentityMethods.ts +4 -0
  177. package/src/types/IdentityStateValue.ts +6 -0
  178. package/src/types/index.ts +3 -0
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const reactBinding = require("@contember/react-binding");
5
+ const useProjectUserRoles = require("../hooks/useProjectUserRoles.cjs");
6
+ const IdentityEnvironmentExtension = require("../environment/IdentityEnvironmentExtension.cjs");
7
+ const ProjectEnvironmentExtension = require("../environment/ProjectEnvironmentExtension.cjs");
8
+ const HasRole = reactBinding.Component(({ children, role }) => {
9
+ const projectRoles = useProjectUserRoles.useProjectUserRoles();
10
+ return evaluateCondition(role, projectRoles) ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }) : null;
11
+ }, ({ children, role }, env) => {
12
+ const identity = env.getExtension(IdentityEnvironmentExtension.identityEnvironmentExtension).identity;
13
+ const project = env.getExtension(ProjectEnvironmentExtension.projectEnvironmentExtension).slug;
14
+ const projectRoles = new Set(identity?.projects.find((it) => it.slug === project)?.roles ?? []);
15
+ return evaluateCondition(role, projectRoles) ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }) : null;
16
+ });
17
+ const evaluateCondition = (condition, roles) => {
18
+ if (typeof condition === "string") {
19
+ return roles.has(condition);
20
+ }
21
+ return condition(roles);
22
+ };
23
+ exports.HasRole = HasRole;
24
+ //# sourceMappingURL=HasRole.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HasRole.cjs","sources":["../../../src/components/HasRole.tsx"],"sourcesContent":["import { Component } from '@contember/react-binding'\nimport { ReactNode } from 'react'\nimport { useProjectUserRoles } from '../hooks'\nimport { identityEnvironmentExtension, projectEnvironmentExtension } from '../environment'\n\nexport type RoleCondition = string | ((roles: Set<string>) => boolean)\n\nexport interface HasRoleProps {\n\tchildren?: ReactNode\n\trole: RoleCondition\n}\n\n/**\n * @group Logic Components\n */\nexport const HasRole = Component<HasRoleProps>(({ children, role }) => {\n\tconst projectRoles = useProjectUserRoles()\n\n\treturn evaluateCondition(role, projectRoles) ? <>{children}</> : null\n}, ({ children, role }, env) => {\n\tconst identity = env.getExtension(identityEnvironmentExtension).identity\n\tconst project = env.getExtension(projectEnvironmentExtension).slug\n\tconst projectRoles = new Set(identity?.projects.find(it => it.slug === project)?.roles ?? [])\n\n\treturn evaluateCondition(role, projectRoles) ? <>{children}</> : null\n})\n\nconst evaluateCondition = (condition: RoleCondition, roles: Set<string>) => {\n\tif (typeof condition === 'string') {\n\t\treturn roles.has(condition)\n\t}\n\treturn condition(roles)\n}\n"],"names":["Component","useProjectUserRoles","jsx","Fragment","identityEnvironmentExtension","projectEnvironmentExtension"],"mappings":";;;;;;;AAeO,MAAM,UAAUA,aAAAA,UAAwB,CAAC,EAAE,UAAU,WAAW;AACtE,QAAM,eAAeC,oBAAAA;AAErB,SAAO,kBAAkB,MAAM,YAAY,IAAIC,2BAAAA,IAAAC,WAAAA,UAAA,EAAG,UAAS,IAAM;AAClE,GAAG,CAAC,EAAE,UAAU,KAAA,GAAQ,QAAQ;AAC/B,QAAM,WAAW,IAAI,aAAaC,6BAA4B,4BAAA,EAAE;AAChE,QAAM,UAAU,IAAI,aAAaC,4BAA2B,2BAAA,EAAE;AAC9D,QAAM,eAAe,IAAI,IAAI,UAAU,SAAS,KAAK,CAAM,OAAA,GAAG,SAAS,OAAO,GAAG,SAAS,CAAE,CAAA;AAE5F,SAAO,kBAAkB,MAAM,YAAY,IAAIH,2BAAAA,IAAAC,WAAAA,UAAA,EAAG,UAAS,IAAM;AAClE,CAAC;AAED,MAAM,oBAAoB,CAAC,WAA0B,UAAuB;AACvE,MAAA,OAAO,cAAc,UAAU;AAC3B,WAAA,MAAM,IAAI,SAAS;AAAA,EAC3B;AACA,SAAO,UAAU,KAAK;AACvB;;"}
@@ -0,0 +1,24 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { Component } from "@contember/react-binding";
3
+ import { useProjectUserRoles } from "../hooks/useProjectUserRoles.js";
4
+ import { identityEnvironmentExtension } from "../environment/IdentityEnvironmentExtension.js";
5
+ import { projectEnvironmentExtension } from "../environment/ProjectEnvironmentExtension.js";
6
+ const HasRole = Component(({ children, role }) => {
7
+ const projectRoles = useProjectUserRoles();
8
+ return evaluateCondition(role, projectRoles) ? /* @__PURE__ */ jsx(Fragment, { children }) : null;
9
+ }, ({ children, role }, env) => {
10
+ const identity = env.getExtension(identityEnvironmentExtension).identity;
11
+ const project = env.getExtension(projectEnvironmentExtension).slug;
12
+ const projectRoles = new Set(identity?.projects.find((it) => it.slug === project)?.roles ?? []);
13
+ return evaluateCondition(role, projectRoles) ? /* @__PURE__ */ jsx(Fragment, { children }) : null;
14
+ });
15
+ const evaluateCondition = (condition, roles) => {
16
+ if (typeof condition === "string") {
17
+ return roles.has(condition);
18
+ }
19
+ return condition(roles);
20
+ };
21
+ export {
22
+ HasRole
23
+ };
24
+ //# sourceMappingURL=HasRole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HasRole.js","sources":["../../../src/components/HasRole.tsx"],"sourcesContent":["import { Component } from '@contember/react-binding'\nimport { ReactNode } from 'react'\nimport { useProjectUserRoles } from '../hooks'\nimport { identityEnvironmentExtension, projectEnvironmentExtension } from '../environment'\n\nexport type RoleCondition = string | ((roles: Set<string>) => boolean)\n\nexport interface HasRoleProps {\n\tchildren?: ReactNode\n\trole: RoleCondition\n}\n\n/**\n * @group Logic Components\n */\nexport const HasRole = Component<HasRoleProps>(({ children, role }) => {\n\tconst projectRoles = useProjectUserRoles()\n\n\treturn evaluateCondition(role, projectRoles) ? <>{children}</> : null\n}, ({ children, role }, env) => {\n\tconst identity = env.getExtension(identityEnvironmentExtension).identity\n\tconst project = env.getExtension(projectEnvironmentExtension).slug\n\tconst projectRoles = new Set(identity?.projects.find(it => it.slug === project)?.roles ?? [])\n\n\treturn evaluateCondition(role, projectRoles) ? <>{children}</> : null\n})\n\nconst evaluateCondition = (condition: RoleCondition, roles: Set<string>) => {\n\tif (typeof condition === 'string') {\n\t\treturn roles.has(condition)\n\t}\n\treturn condition(roles)\n}\n"],"names":[],"mappings":";;;;;AAeO,MAAM,UAAU,UAAwB,CAAC,EAAE,UAAU,WAAW;AACtE,QAAM,eAAe;AAErB,SAAO,kBAAkB,MAAM,YAAY,IAAI,oBAAA,UAAA,EAAG,UAAS,IAAM;AAClE,GAAG,CAAC,EAAE,UAAU,KAAA,GAAQ,QAAQ;AAC/B,QAAM,WAAW,IAAI,aAAa,4BAA4B,EAAE;AAChE,QAAM,UAAU,IAAI,aAAa,2BAA2B,EAAE;AAC9D,QAAM,eAAe,IAAI,IAAI,UAAU,SAAS,KAAK,CAAM,OAAA,GAAG,SAAS,OAAO,GAAG,SAAS,CAAE,CAAA;AAE5F,SAAO,kBAAkB,MAAM,YAAY,IAAI,oBAAA,UAAA,EAAG,UAAS,IAAM;AAClE,CAAC;AAED,MAAM,oBAAoB,CAAC,WAA0B,UAAuB;AACvE,MAAA,OAAO,cAAc,UAAU;AAC3B,WAAA,MAAM,IAAI,SAAS;AAAA,EAC3B;AACA,SAAO,UAAU,KAAK;AACvB;"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const reactClient = require("@contember/react-client");
5
+ const react = require("react");
6
+ const reactBinding = require("@contember/react-binding");
7
+ const contexts = require("../internal/contexts.cjs");
8
+ const IdentityEnvironmentExtension = require("../environment/IdentityEnvironmentExtension.cjs");
9
+ const useFetchIdentity = require("../hooks/useFetchIdentity.cjs");
10
+ const IdentityProvider = ({ children }) => {
11
+ const sessionToken = reactClient.useSessionToken();
12
+ const [{ identity, state }, methods] = useFetchIdentity.useFetchIdentity();
13
+ const { refreshIdentity, clearIdentity } = methods;
14
+ react.useEffect(
15
+ () => {
16
+ if (sessionToken !== void 0) {
17
+ refreshIdentity();
18
+ } else {
19
+ clearIdentity();
20
+ }
21
+ },
22
+ [sessionToken, refreshIdentity, clearIdentity]
23
+ );
24
+ return /* @__PURE__ */ jsxRuntime.jsx(contexts.IdentityStateContext.Provider, { value: state, children: /* @__PURE__ */ jsxRuntime.jsx(contexts.IdentityContext.Provider, { value: identity, children: /* @__PURE__ */ jsxRuntime.jsx(contexts.IdentityMethodsContext.Provider, { value: methods, children: /* @__PURE__ */ jsxRuntime.jsx(reactBinding.EnvironmentExtensionProvider, { extension: IdentityEnvironmentExtension.identityEnvironmentExtension, state: identity ?? null, children }) }) }) });
25
+ };
26
+ exports.IdentityProvider = IdentityProvider;
27
+ //# sourceMappingURL=IdentityProvider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProvider.cjs","sources":["../../../src/components/IdentityProvider.tsx"],"sourcesContent":["import { useSessionToken } from '@contember/react-client'\nimport { ReactNode, useEffect } from 'react'\nimport { EnvironmentExtensionProvider } from '@contember/react-binding'\nimport { useFetchIdentity } from '../hooks'\nimport { IdentityContext, IdentityMethodsContext, IdentityStateContext } from '../internal/contexts'\nimport { identityEnvironmentExtension } from '../environment/IdentityEnvironmentExtension'\n\n\nexport interface IdentityProviderProps {\n\tchildren: ReactNode\n}\n\nexport const IdentityProvider: React.FC<IdentityProviderProps> = ({ children }) => {\n\tconst sessionToken = useSessionToken()\n\tconst [{ identity, state }, methods] = useFetchIdentity()\n\n\tconst { refreshIdentity, clearIdentity } = methods\n\tuseEffect(\n\t\t() => {\n\t\t\tif (sessionToken !== undefined) {\n\t\t\t\trefreshIdentity()\n\t\t\t} else {\n\t\t\t\tclearIdentity()\n\t\t\t}\n\t\t},\n\t\t[sessionToken, refreshIdentity, clearIdentity],\n\t)\n\n\treturn (\n\t\t<IdentityStateContext.Provider value={state}>\n\t\t\t<IdentityContext.Provider value={identity}>\n\t\t\t\t<IdentityMethodsContext.Provider value={methods}>\n\t\t\t\t\t<EnvironmentExtensionProvider extension={identityEnvironmentExtension} state={identity ?? null}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</EnvironmentExtensionProvider>\n\t\t\t\t</IdentityMethodsContext.Provider>\n\t\t\t</IdentityContext.Provider>\n\t\t</IdentityStateContext.Provider>\n\t)\n}\n"],"names":["useSessionToken","useFetchIdentity","useEffect","jsx","IdentityStateContext","IdentityContext","IdentityMethodsContext","EnvironmentExtensionProvider","identityEnvironmentExtension"],"mappings":";;;;;;;;;AAYO,MAAM,mBAAoD,CAAC,EAAE,eAAe;AAClF,QAAM,eAAeA,YAAAA;AACrB,QAAM,CAAC,EAAE,UAAU,MAAS,GAAA,OAAO,IAAIC,iBAAAA;AAEjC,QAAA,EAAE,iBAAiB,cAAkB,IAAA;AAC3CC,QAAA;AAAA,IACC,MAAM;AACL,UAAI,iBAAiB,QAAW;AACf;MAAA,OACV;AACQ;MACf;AAAA,IACD;AAAA,IACA,CAAC,cAAc,iBAAiB,aAAa;AAAA,EAAA;AAG9C,SACEC,2BAAAA,IAAAC,SAAAA,qBAAqB,UAArB,EAA8B,OAAO,OACrC,UAACD,2BAAAA,IAAAE,SAAAA,gBAAgB,UAAhB,EAAyB,OAAO,UAChC,UAACF,2BAAA,IAAAG,gCAAuB,UAAvB,EAAgC,OAAO,SACvC,UAACH,2BAAA,IAAAI,aAAA,8BAAA,EAA6B,WAAWC,6BAAA,8BAA8B,OAAO,YAAY,MACxF,SAAA,CACF,EACD,CAAA,EAAA,CACD,EACD,CAAA;AAEF;;"}
@@ -0,0 +1,27 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useSessionToken } from "@contember/react-client";
3
+ import { useEffect } from "react";
4
+ import { EnvironmentExtensionProvider } from "@contember/react-binding";
5
+ import { IdentityStateContext, IdentityContext, IdentityMethodsContext } from "../internal/contexts.js";
6
+ import { identityEnvironmentExtension } from "../environment/IdentityEnvironmentExtension.js";
7
+ import { useFetchIdentity } from "../hooks/useFetchIdentity.js";
8
+ const IdentityProvider = ({ children }) => {
9
+ const sessionToken = useSessionToken();
10
+ const [{ identity, state }, methods] = useFetchIdentity();
11
+ const { refreshIdentity, clearIdentity } = methods;
12
+ useEffect(
13
+ () => {
14
+ if (sessionToken !== void 0) {
15
+ refreshIdentity();
16
+ } else {
17
+ clearIdentity();
18
+ }
19
+ },
20
+ [sessionToken, refreshIdentity, clearIdentity]
21
+ );
22
+ return /* @__PURE__ */ jsx(IdentityStateContext.Provider, { value: state, children: /* @__PURE__ */ jsx(IdentityContext.Provider, { value: identity, children: /* @__PURE__ */ jsx(IdentityMethodsContext.Provider, { value: methods, children: /* @__PURE__ */ jsx(EnvironmentExtensionProvider, { extension: identityEnvironmentExtension, state: identity ?? null, children }) }) }) });
23
+ };
24
+ export {
25
+ IdentityProvider
26
+ };
27
+ //# sourceMappingURL=IdentityProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProvider.js","sources":["../../../src/components/IdentityProvider.tsx"],"sourcesContent":["import { useSessionToken } from '@contember/react-client'\nimport { ReactNode, useEffect } from 'react'\nimport { EnvironmentExtensionProvider } from '@contember/react-binding'\nimport { useFetchIdentity } from '../hooks'\nimport { IdentityContext, IdentityMethodsContext, IdentityStateContext } from '../internal/contexts'\nimport { identityEnvironmentExtension } from '../environment/IdentityEnvironmentExtension'\n\n\nexport interface IdentityProviderProps {\n\tchildren: ReactNode\n}\n\nexport const IdentityProvider: React.FC<IdentityProviderProps> = ({ children }) => {\n\tconst sessionToken = useSessionToken()\n\tconst [{ identity, state }, methods] = useFetchIdentity()\n\n\tconst { refreshIdentity, clearIdentity } = methods\n\tuseEffect(\n\t\t() => {\n\t\t\tif (sessionToken !== undefined) {\n\t\t\t\trefreshIdentity()\n\t\t\t} else {\n\t\t\t\tclearIdentity()\n\t\t\t}\n\t\t},\n\t\t[sessionToken, refreshIdentity, clearIdentity],\n\t)\n\n\treturn (\n\t\t<IdentityStateContext.Provider value={state}>\n\t\t\t<IdentityContext.Provider value={identity}>\n\t\t\t\t<IdentityMethodsContext.Provider value={methods}>\n\t\t\t\t\t<EnvironmentExtensionProvider extension={identityEnvironmentExtension} state={identity ?? null}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</EnvironmentExtensionProvider>\n\t\t\t\t</IdentityMethodsContext.Provider>\n\t\t\t</IdentityContext.Provider>\n\t\t</IdentityStateContext.Provider>\n\t)\n}\n"],"names":[],"mappings":";;;;;;;AAYO,MAAM,mBAAoD,CAAC,EAAE,eAAe;AAClF,QAAM,eAAe;AACrB,QAAM,CAAC,EAAE,UAAU,MAAS,GAAA,OAAO,IAAI;AAEjC,QAAA,EAAE,iBAAiB,cAAkB,IAAA;AAC3C;AAAA,IACC,MAAM;AACL,UAAI,iBAAiB,QAAW;AACf;MAAA,OACV;AACQ;MACf;AAAA,IACD;AAAA,IACA,CAAC,cAAc,iBAAiB,aAAa;AAAA,EAAA;AAG9C,SACE,oBAAA,qBAAqB,UAArB,EAA8B,OAAO,OACrC,UAAC,oBAAA,gBAAgB,UAAhB,EAAyB,OAAO,UAChC,UAAC,oBAAA,uBAAuB,UAAvB,EAAgC,OAAO,SACvC,UAAC,oBAAA,8BAAA,EAA6B,WAAW,8BAA8B,OAAO,YAAY,MACxF,SAAA,CACF,EACD,CAAA,EAAA,CACD,EACD,CAAA;AAEF;"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const contexts = require("../internal/contexts.cjs");
4
+ const IdentityState = ({ state, children }) => {
5
+ const currentState = contexts.useIdentityState();
6
+ return state === currentState || Array.isArray(state) && state.includes(currentState) ? children : null;
7
+ };
8
+ exports.IdentityState = IdentityState;
9
+ //# sourceMappingURL=IdentityState.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityState.cjs","sources":["../../../src/components/IdentityState.tsx"],"sourcesContent":["import { ReactNode } from 'react'\nimport { IdentityStateValue } from '../types'\nimport { useIdentityState } from '../internal/contexts'\n\nexport interface IdentityStateProps {\n\tstate: IdentityStateValue | IdentityStateValue[]\n\tchildren: ReactNode\n}\n\nexport const IdentityState = ({ state, children }: IdentityStateProps) => {\n\tconst currentState = useIdentityState()\n\n\treturn state === currentState || (Array.isArray(state) && state.includes(currentState)) ? children : null\n}\n"],"names":["useIdentityState"],"mappings":";;;AASO,MAAM,gBAAgB,CAAC,EAAE,OAAO,eAAmC;AACzE,QAAM,eAAeA,SAAAA;AAEd,SAAA,UAAU,gBAAiB,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,YAAY,IAAK,WAAW;AACtG;;"}
@@ -0,0 +1,9 @@
1
+ import { useIdentityState } from "../internal/contexts.js";
2
+ const IdentityState = ({ state, children }) => {
3
+ const currentState = useIdentityState();
4
+ return state === currentState || Array.isArray(state) && state.includes(currentState) ? children : null;
5
+ };
6
+ export {
7
+ IdentityState
8
+ };
9
+ //# sourceMappingURL=IdentityState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityState.js","sources":["../../../src/components/IdentityState.tsx"],"sourcesContent":["import { ReactNode } from 'react'\nimport { IdentityStateValue } from '../types'\nimport { useIdentityState } from '../internal/contexts'\n\nexport interface IdentityStateProps {\n\tstate: IdentityStateValue | IdentityStateValue[]\n\tchildren: ReactNode\n}\n\nexport const IdentityState = ({ state, children }: IdentityStateProps) => {\n\tconst currentState = useIdentityState()\n\n\treturn state === currentState || (Array.isArray(state) && state.includes(currentState)) ? children : null\n}\n"],"names":[],"mappings":";AASO,MAAM,gBAAgB,CAAC,EAAE,OAAO,eAAmC;AACzE,QAAM,eAAe;AAEd,SAAA,UAAU,gBAAiB,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,YAAY,IAAK,WAAW;AACtG;"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const reactSlot = require("@radix-ui/react-slot");
6
+ const useLogout = require("../hooks/useLogout.cjs");
7
+ const LogoutTrigger = ({ children }) => {
8
+ const logout = useLogout.useLogout();
9
+ return /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slot, { onClick: react.useCallback(() => logout(), [logout]), children });
10
+ };
11
+ exports.LogoutTrigger = LogoutTrigger;
12
+ //# sourceMappingURL=LogoutTrigger.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogoutTrigger.cjs","sources":["../../../src/components/LogoutTrigger.tsx"],"sourcesContent":["import { ReactNode, useCallback } from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { useLogout } from '../hooks'\n\nexport const LogoutTrigger = ({ children }: {\n\tchildren: ReactNode\n}) => {\n\tconst logout = useLogout()\n\treturn <Slot onClick={useCallback(() => logout(), [logout])}>{children}</Slot>\n}\n"],"names":["useLogout","jsx","Slot","useCallback"],"mappings":";;;;;;AAIO,MAAM,gBAAgB,CAAC,EAAE,eAE1B;AACL,QAAM,SAASA,UAAAA;AACR,SAAAC,+BAACC,UAAAA,MAAK,EAAA,SAASC,MAAAA,YAAY,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,GAAI,SAAS,CAAA;AACxE;;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useCallback } from "react";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { useLogout } from "../hooks/useLogout.js";
5
+ const LogoutTrigger = ({ children }) => {
6
+ const logout = useLogout();
7
+ return /* @__PURE__ */ jsx(Slot, { onClick: useCallback(() => logout(), [logout]), children });
8
+ };
9
+ export {
10
+ LogoutTrigger
11
+ };
12
+ //# sourceMappingURL=LogoutTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogoutTrigger.js","sources":["../../../src/components/LogoutTrigger.tsx"],"sourcesContent":["import { ReactNode, useCallback } from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { useLogout } from '../hooks'\n\nexport const LogoutTrigger = ({ children }: {\n\tchildren: ReactNode\n}) => {\n\tconst logout = useLogout()\n\treturn <Slot onClick={useCallback(() => logout(), [logout])}>{children}</Slot>\n}\n"],"names":[],"mappings":";;;;AAIO,MAAM,gBAAgB,CAAC,EAAE,eAE1B;AACL,QAAM,SAAS;AACR,SAAA,oBAAC,MAAK,EAAA,SAAS,YAAY,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,GAAI,SAAS,CAAA;AACxE;"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactBinding = require("@contember/react-binding");
4
+ const identityEnvironmentExtension = reactBinding.Environment.createExtension((state) => {
5
+ if (state === void 0) {
6
+ throw new reactBinding.BindingError("Environment does not contain identity state.");
7
+ }
8
+ return {
9
+ identity: state ?? void 0
10
+ };
11
+ });
12
+ exports.identityEnvironmentExtension = identityEnvironmentExtension;
13
+ //# sourceMappingURL=IdentityEnvironmentExtension.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityEnvironmentExtension.cjs","sources":["../../../src/environment/IdentityEnvironmentExtension.ts"],"sourcesContent":["import { BindingError, Environment } from '@contember/react-binding'\nimport { Identity } from '../types'\n\nexport const identityEnvironmentExtension = Environment.createExtension((state: Identity | null | undefined) => {\n\tif (state === undefined) {\n\t\tthrow new BindingError('Environment does not contain identity state.')\n\t}\n\n\treturn {\n\t\tidentity: state ?? undefined,\n\t}\n})\n"],"names":["Environment","BindingError"],"mappings":";;;AAGO,MAAM,+BAA+BA,aAAA,YAAY,gBAAgB,CAAC,UAAuC;AAC/G,MAAI,UAAU,QAAW;AAClB,UAAA,IAAIC,aAAAA,aAAa,8CAA8C;AAAA,EACtE;AAEO,SAAA;AAAA,IACN,UAAU,SAAS;AAAA,EAAA;AAErB,CAAC;;"}
@@ -0,0 +1,13 @@
1
+ import { Environment, BindingError } from "@contember/react-binding";
2
+ const identityEnvironmentExtension = Environment.createExtension((state) => {
3
+ if (state === void 0) {
4
+ throw new BindingError("Environment does not contain identity state.");
5
+ }
6
+ return {
7
+ identity: state ?? void 0
8
+ };
9
+ });
10
+ export {
11
+ identityEnvironmentExtension
12
+ };
13
+ //# sourceMappingURL=IdentityEnvironmentExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityEnvironmentExtension.js","sources":["../../../src/environment/IdentityEnvironmentExtension.ts"],"sourcesContent":["import { BindingError, Environment } from '@contember/react-binding'\nimport { Identity } from '../types'\n\nexport const identityEnvironmentExtension = Environment.createExtension((state: Identity | null | undefined) => {\n\tif (state === undefined) {\n\t\tthrow new BindingError('Environment does not contain identity state.')\n\t}\n\n\treturn {\n\t\tidentity: state ?? undefined,\n\t}\n})\n"],"names":[],"mappings":";AAGO,MAAM,+BAA+B,YAAY,gBAAgB,CAAC,UAAuC;AAC/G,MAAI,UAAU,QAAW;AAClB,UAAA,IAAI,aAAa,8CAA8C;AAAA,EACtE;AAEO,SAAA;AAAA,IACN,UAAU,SAAS;AAAA,EAAA;AAErB,CAAC;"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactBinding = require("@contember/react-binding");
4
+ const projectEnvironmentExtension = reactBinding.Environment.createExtension((slug) => {
5
+ if (slug === void 0) {
6
+ throw new reactBinding.BindingError("Environment does not contain project slug state.");
7
+ }
8
+ return {
9
+ slug: slug ?? void 0
10
+ };
11
+ });
12
+ exports.projectEnvironmentExtension = projectEnvironmentExtension;
13
+ //# sourceMappingURL=ProjectEnvironmentExtension.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectEnvironmentExtension.cjs","sources":["../../../src/environment/ProjectEnvironmentExtension.tsx"],"sourcesContent":["import { BindingError, Environment } from '@contember/react-binding'\n\nexport const projectEnvironmentExtension = Environment.createExtension((slug: string | null | undefined) => {\n\tif (slug === undefined) {\n\t\tthrow new BindingError('Environment does not contain project slug state.')\n\t}\n\treturn {\n\t\tslug: slug ?? undefined,\n\t}\n})\n"],"names":["Environment","BindingError"],"mappings":";;;AAEO,MAAM,8BAA8BA,aAAA,YAAY,gBAAgB,CAAC,SAAoC;AAC3G,MAAI,SAAS,QAAW;AACjB,UAAA,IAAIC,aAAAA,aAAa,kDAAkD;AAAA,EAC1E;AACO,SAAA;AAAA,IACN,MAAM,QAAQ;AAAA,EAAA;AAEhB,CAAC;;"}
@@ -0,0 +1,13 @@
1
+ import { Environment, BindingError } from "@contember/react-binding";
2
+ const projectEnvironmentExtension = Environment.createExtension((slug) => {
3
+ if (slug === void 0) {
4
+ throw new BindingError("Environment does not contain project slug state.");
5
+ }
6
+ return {
7
+ slug: slug ?? void 0
8
+ };
9
+ });
10
+ export {
11
+ projectEnvironmentExtension
12
+ };
13
+ //# sourceMappingURL=ProjectEnvironmentExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectEnvironmentExtension.js","sources":["../../../src/environment/ProjectEnvironmentExtension.tsx"],"sourcesContent":["import { BindingError, Environment } from '@contember/react-binding'\n\nexport const projectEnvironmentExtension = Environment.createExtension((slug: string | null | undefined) => {\n\tif (slug === undefined) {\n\t\tthrow new BindingError('Environment does not contain project slug state.')\n\t}\n\treturn {\n\t\tslug: slug ?? undefined,\n\t}\n})\n"],"names":[],"mappings":";AAEO,MAAM,8BAA8B,YAAY,gBAAgB,CAAC,SAAoC;AAC3G,MAAI,SAAS,QAAW;AACjB,UAAA,IAAI,aAAa,kDAAkD;AAAA,EAC1E;AACO,SAAA;AAAA,IACN,MAAM,QAAQ;AAAA,EAAA;AAEhB,CAAC;"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const reactClient = require("@contember/react-client");
5
+ const useFetchMe = require("../internal/hooks/useFetchMe.cjs");
6
+ const useLogoutInternal = require("../internal/hooks/useLogoutInternal.cjs");
7
+ const useFetchIdentity = () => {
8
+ const sessionToken = reactClient.useSessionToken();
9
+ const fetchMe = useFetchMe.useFetchMe();
10
+ const [identityState, setIdentityState] = react.useState(sessionToken ? "loading" : "none");
11
+ const [identity, setIdentity] = react.useState();
12
+ const clearIdentity = react.useCallback(() => setIdentityState("cleared"), []);
13
+ const logout = useLogoutInternal.useLogoutInternal(clearIdentity);
14
+ const fetch = react.useCallback(async () => {
15
+ setIdentityState("loading");
16
+ try {
17
+ const response = await fetchMe();
18
+ const person = response.person;
19
+ const projects = response.projects;
20
+ const permissions = response.permissions ?? { canCreateProject: false };
21
+ setIdentityState("success");
22
+ setIdentity({
23
+ id: response.id,
24
+ person: person ?? void 0,
25
+ projects: projects.map((it) => ({
26
+ name: it.project.name,
27
+ slug: it.project.slug,
28
+ roles: it.memberships.map((it2) => it2.role)
29
+ })),
30
+ permissions
31
+ });
32
+ } catch (e) {
33
+ console.error(e);
34
+ if (typeof e === "object" && e !== null && "status" in e && e.status === 401) {
35
+ logout({ noRedirect: true });
36
+ setIdentityState("cleared");
37
+ } else {
38
+ setIdentityState("failed");
39
+ }
40
+ }
41
+ }, [fetchMe, logout]);
42
+ return [
43
+ { state: identityState, identity },
44
+ react.useMemo(() => ({
45
+ clearIdentity,
46
+ refreshIdentity: fetch
47
+ }), [clearIdentity, fetch])
48
+ ];
49
+ };
50
+ exports.useFetchIdentity = useFetchIdentity;
51
+ //# sourceMappingURL=useFetchIdentity.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchIdentity.cjs","sources":["../../../src/hooks/useFetchIdentity.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react'\nimport { Identity, IdentityMethods, IdentityStateValue } from '../types'\nimport { useSessionToken } from '@contember/react-client'\nimport { useFetchMe } from '../internal/hooks/useFetchMe'\nimport { useLogoutInternal } from '../internal/hooks/useLogoutInternal'\n\nexport const useFetchIdentity = (): [{ state: IdentityStateValue, identity: Identity | undefined }, IdentityMethods] => {\n\tconst sessionToken = useSessionToken()\n\tconst fetchMe = useFetchMe()\n\n\tconst [identityState, setIdentityState] = useState<IdentityStateValue>(sessionToken ? 'loading' : 'none')\n\tconst [identity, setIdentity] = useState<Identity | undefined>()\n\n\tconst clearIdentity = useCallback(() => setIdentityState('cleared'), [])\n\tconst logout = useLogoutInternal(clearIdentity)\n\n\tconst fetch = useCallback(async () => {\n\t\tsetIdentityState('loading')\n\t\ttry {\n\t\t\tconst response = await fetchMe()\n\t\t\tconst person = response.person\n\t\t\tconst projects = response.projects\n\t\t\tconst permissions = response.permissions ?? { canCreateProject: false }\n\n\t\t\tsetIdentityState('success')\n\t\t\tsetIdentity({\n\t\t\t\tid: response.id,\n\t\t\t\tperson: person ?? undefined,\n\t\t\t\tprojects: projects.map(it => ({\n\t\t\t\t\tname: it.project.name,\n\t\t\t\t\tslug: it.project.slug,\n\t\t\t\t\troles: it.memberships.map(it => it.role),\n\t\t\t\t})),\n\t\t\t\tpermissions,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\tif (typeof e === 'object' && e !== null && 'status' in e && (e as { status?: unknown }).status === 401) {\n\t\t\t\tlogout({ noRedirect: true })\n\t\t\t\tsetIdentityState('cleared')\n\t\t\t} else {\n\t\t\t\tsetIdentityState('failed')\n\t\t\t}\n\t\t}\n\t}, [fetchMe, logout])\n\n\treturn [\n\t\t{ state: identityState, identity },\n\t\tuseMemo((): IdentityMethods => ({\n\t\t\tclearIdentity,\n\t\t\trefreshIdentity: fetch,\n\t\t}), [clearIdentity, fetch]),\n\t]\n}\n"],"names":["useSessionToken","useFetchMe","useState","useCallback","useLogoutInternal","it","useMemo"],"mappings":";;;;;;AAMO,MAAM,mBAAmB,MAAwF;AACvH,QAAM,eAAeA,YAAAA;AACrB,QAAM,UAAUC,WAAAA;AAEhB,QAAM,CAAC,eAAe,gBAAgB,IAAIC,MAA6B,SAAA,eAAe,YAAY,MAAM;AACxG,QAAM,CAAC,UAAU,WAAW,IAAIA,MAA+B,SAAA;AAE/D,QAAM,gBAAgBC,MAAAA,YAAY,MAAM,iBAAiB,SAAS,GAAG,CAAA,CAAE;AACjE,QAAA,SAASC,oCAAkB,aAAa;AAExC,QAAA,QAAQD,MAAAA,YAAY,YAAY;AACrC,qBAAiB,SAAS;AACtB,QAAA;AACG,YAAA,WAAW,MAAM;AACvB,YAAM,SAAS,SAAS;AACxB,YAAM,WAAW,SAAS;AAC1B,YAAM,cAAc,SAAS,eAAe,EAAE,kBAAkB,MAAM;AAEtE,uBAAiB,SAAS;AACd,kBAAA;AAAA,QACX,IAAI,SAAS;AAAA,QACb,QAAQ,UAAU;AAAA,QAClB,UAAU,SAAS,IAAI,CAAO,QAAA;AAAA,UAC7B,MAAM,GAAG,QAAQ;AAAA,UACjB,MAAM,GAAG,QAAQ;AAAA,UACjB,OAAO,GAAG,YAAY,IAAI,CAAAE,QAAMA,IAAG,IAAI;AAAA,QAAA,EACtC;AAAA,QACF;AAAA,MAAA,CACA;AAAA,aACO,GAAG;AACX,cAAQ,MAAM,CAAC;AACX,UAAA,OAAO,MAAM,YAAY,MAAM,QAAQ,YAAY,KAAM,EAA2B,WAAW,KAAK;AAChG,eAAA,EAAE,YAAY,KAAA,CAAM;AAC3B,yBAAiB,SAAS;AAAA,MAAA,OACpB;AACN,yBAAiB,QAAQ;AAAA,MAC1B;AAAA,IACD;AAAA,EAAA,GACE,CAAC,SAAS,MAAM,CAAC;AAEb,SAAA;AAAA,IACN,EAAE,OAAO,eAAe,SAAS;AAAA,IACjCC,MAAAA,QAAQ,OAAwB;AAAA,MAC/B;AAAA,MACA,iBAAiB;AAAA,IAAA,IACd,CAAC,eAAe,KAAK,CAAC;AAAA,EAAA;AAE5B;;"}
@@ -0,0 +1,51 @@
1
+ import { useState, useCallback, useMemo } from "react";
2
+ import { useSessionToken } from "@contember/react-client";
3
+ import { useFetchMe } from "../internal/hooks/useFetchMe.js";
4
+ import { useLogoutInternal } from "../internal/hooks/useLogoutInternal.js";
5
+ const useFetchIdentity = () => {
6
+ const sessionToken = useSessionToken();
7
+ const fetchMe = useFetchMe();
8
+ const [identityState, setIdentityState] = useState(sessionToken ? "loading" : "none");
9
+ const [identity, setIdentity] = useState();
10
+ const clearIdentity = useCallback(() => setIdentityState("cleared"), []);
11
+ const logout = useLogoutInternal(clearIdentity);
12
+ const fetch = useCallback(async () => {
13
+ setIdentityState("loading");
14
+ try {
15
+ const response = await fetchMe();
16
+ const person = response.person;
17
+ const projects = response.projects;
18
+ const permissions = response.permissions ?? { canCreateProject: false };
19
+ setIdentityState("success");
20
+ setIdentity({
21
+ id: response.id,
22
+ person: person ?? void 0,
23
+ projects: projects.map((it) => ({
24
+ name: it.project.name,
25
+ slug: it.project.slug,
26
+ roles: it.memberships.map((it2) => it2.role)
27
+ })),
28
+ permissions
29
+ });
30
+ } catch (e) {
31
+ console.error(e);
32
+ if (typeof e === "object" && e !== null && "status" in e && e.status === 401) {
33
+ logout({ noRedirect: true });
34
+ setIdentityState("cleared");
35
+ } else {
36
+ setIdentityState("failed");
37
+ }
38
+ }
39
+ }, [fetchMe, logout]);
40
+ return [
41
+ { state: identityState, identity },
42
+ useMemo(() => ({
43
+ clearIdentity,
44
+ refreshIdentity: fetch
45
+ }), [clearIdentity, fetch])
46
+ ];
47
+ };
48
+ export {
49
+ useFetchIdentity
50
+ };
51
+ //# sourceMappingURL=useFetchIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchIdentity.js","sources":["../../../src/hooks/useFetchIdentity.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react'\nimport { Identity, IdentityMethods, IdentityStateValue } from '../types'\nimport { useSessionToken } from '@contember/react-client'\nimport { useFetchMe } from '../internal/hooks/useFetchMe'\nimport { useLogoutInternal } from '../internal/hooks/useLogoutInternal'\n\nexport const useFetchIdentity = (): [{ state: IdentityStateValue, identity: Identity | undefined }, IdentityMethods] => {\n\tconst sessionToken = useSessionToken()\n\tconst fetchMe = useFetchMe()\n\n\tconst [identityState, setIdentityState] = useState<IdentityStateValue>(sessionToken ? 'loading' : 'none')\n\tconst [identity, setIdentity] = useState<Identity | undefined>()\n\n\tconst clearIdentity = useCallback(() => setIdentityState('cleared'), [])\n\tconst logout = useLogoutInternal(clearIdentity)\n\n\tconst fetch = useCallback(async () => {\n\t\tsetIdentityState('loading')\n\t\ttry {\n\t\t\tconst response = await fetchMe()\n\t\t\tconst person = response.person\n\t\t\tconst projects = response.projects\n\t\t\tconst permissions = response.permissions ?? { canCreateProject: false }\n\n\t\t\tsetIdentityState('success')\n\t\t\tsetIdentity({\n\t\t\t\tid: response.id,\n\t\t\t\tperson: person ?? undefined,\n\t\t\t\tprojects: projects.map(it => ({\n\t\t\t\t\tname: it.project.name,\n\t\t\t\t\tslug: it.project.slug,\n\t\t\t\t\troles: it.memberships.map(it => it.role),\n\t\t\t\t})),\n\t\t\t\tpermissions,\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.error(e)\n\t\t\tif (typeof e === 'object' && e !== null && 'status' in e && (e as { status?: unknown }).status === 401) {\n\t\t\t\tlogout({ noRedirect: true })\n\t\t\t\tsetIdentityState('cleared')\n\t\t\t} else {\n\t\t\t\tsetIdentityState('failed')\n\t\t\t}\n\t\t}\n\t}, [fetchMe, logout])\n\n\treturn [\n\t\t{ state: identityState, identity },\n\t\tuseMemo((): IdentityMethods => ({\n\t\t\tclearIdentity,\n\t\t\trefreshIdentity: fetch,\n\t\t}), [clearIdentity, fetch]),\n\t]\n}\n"],"names":["it"],"mappings":";;;;AAMO,MAAM,mBAAmB,MAAwF;AACvH,QAAM,eAAe;AACrB,QAAM,UAAU;AAEhB,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA6B,eAAe,YAAY,MAAM;AACxG,QAAM,CAAC,UAAU,WAAW,IAAI,SAA+B;AAE/D,QAAM,gBAAgB,YAAY,MAAM,iBAAiB,SAAS,GAAG,CAAA,CAAE;AACjE,QAAA,SAAS,kBAAkB,aAAa;AAExC,QAAA,QAAQ,YAAY,YAAY;AACrC,qBAAiB,SAAS;AACtB,QAAA;AACG,YAAA,WAAW,MAAM;AACvB,YAAM,SAAS,SAAS;AACxB,YAAM,WAAW,SAAS;AAC1B,YAAM,cAAc,SAAS,eAAe,EAAE,kBAAkB,MAAM;AAEtE,uBAAiB,SAAS;AACd,kBAAA;AAAA,QACX,IAAI,SAAS;AAAA,QACb,QAAQ,UAAU;AAAA,QAClB,UAAU,SAAS,IAAI,CAAO,QAAA;AAAA,UAC7B,MAAM,GAAG,QAAQ;AAAA,UACjB,MAAM,GAAG,QAAQ;AAAA,UACjB,OAAO,GAAG,YAAY,IAAI,CAAAA,QAAMA,IAAG,IAAI;AAAA,QAAA,EACtC;AAAA,QACF;AAAA,MAAA,CACA;AAAA,aACO,GAAG;AACX,cAAQ,MAAM,CAAC;AACX,UAAA,OAAO,MAAM,YAAY,MAAM,QAAQ,YAAY,KAAM,EAA2B,WAAW,KAAK;AAChG,eAAA,EAAE,YAAY,KAAA,CAAM;AAC3B,yBAAiB,SAAS;AAAA,MAAA,OACpB;AACN,yBAAiB,QAAQ;AAAA,MAC1B;AAAA,IACD;AAAA,EAAA,GACE,CAAC,SAAS,MAAM,CAAC;AAEb,SAAA;AAAA,IACN,EAAE,OAAO,eAAe,SAAS;AAAA,IACjC,QAAQ,OAAwB;AAAA,MAC/B;AAAA,MACA,iBAAiB;AAAA,IAAA,IACd,CAAC,eAAe,KAAK,CAAC;AAAA,EAAA;AAE5B;"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const contexts = require("../internal/contexts.cjs");
4
+ const useLogoutInternal = require("../internal/hooks/useLogoutInternal.cjs");
5
+ const useLogout = () => {
6
+ const { clearIdentity } = contexts.useIdentityMethods();
7
+ return useLogoutInternal.useLogoutInternal(clearIdentity);
8
+ };
9
+ exports.useLogout = useLogout;
10
+ //# sourceMappingURL=useLogout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogout.cjs","sources":["../../../src/hooks/useLogout.ts"],"sourcesContent":["import { useIdentityMethods } from '../internal/contexts'\nimport { useLogoutInternal } from '../internal/hooks/useLogoutInternal'\n\nexport const useLogout = () => {\n\tconst { clearIdentity } = useIdentityMethods()\n\treturn useLogoutInternal(clearIdentity)\n}\n"],"names":["useIdentityMethods","useLogoutInternal"],"mappings":";;;;AAGO,MAAM,YAAY,MAAM;AACxB,QAAA,EAAE,kBAAkBA,SAAAA;AAC1B,SAAOC,kBAAAA,kBAAkB,aAAa;AACvC;;"}
@@ -0,0 +1,10 @@
1
+ import { useIdentityMethods } from "../internal/contexts.js";
2
+ import { useLogoutInternal } from "../internal/hooks/useLogoutInternal.js";
3
+ const useLogout = () => {
4
+ const { clearIdentity } = useIdentityMethods();
5
+ return useLogoutInternal(clearIdentity);
6
+ };
7
+ export {
8
+ useLogout
9
+ };
10
+ //# sourceMappingURL=useLogout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogout.js","sources":["../../../src/hooks/useLogout.ts"],"sourcesContent":["import { useIdentityMethods } from '../internal/contexts'\nimport { useLogoutInternal } from '../internal/hooks/useLogoutInternal'\n\nexport const useLogout = () => {\n\tconst { clearIdentity } = useIdentityMethods()\n\treturn useLogoutInternal(clearIdentity)\n}\n"],"names":[],"mappings":";;AAGO,MAAM,YAAY,MAAM;AACxB,QAAA,EAAE,kBAAkB;AAC1B,SAAO,kBAAkB,aAAa;AACvC;"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const reactClient = require("@contember/react-client");
5
+ const contexts = require("../internal/contexts.cjs");
6
+ const useProjectUserRoles = () => {
7
+ const identity = contexts.useIdentity();
8
+ const projectSlug = reactClient.useProjectSlug();
9
+ return react.useMemo(() => {
10
+ if (!projectSlug) {
11
+ return /* @__PURE__ */ new Set();
12
+ }
13
+ const targetProject = identity?.projects.find((project) => project.slug === projectSlug);
14
+ if (targetProject === void 0) {
15
+ return /* @__PURE__ */ new Set();
16
+ }
17
+ return new Set(targetProject.roles);
18
+ }, [identity?.projects, projectSlug]);
19
+ };
20
+ exports.useProjectUserRoles = useProjectUserRoles;
21
+ //# sourceMappingURL=useProjectUserRoles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjectUserRoles.cjs","sources":["../../../src/hooks/useProjectUserRoles.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { useProjectSlug } from '@contember/react-client'\nimport { useIdentity } from '../internal/contexts'\n\nexport type ProjectUserRoles = Set<string>\n\nexport const useProjectUserRoles = (): ProjectUserRoles => {\n\tconst identity = useIdentity()\n\tconst projectSlug = useProjectSlug()\n\treturn useMemo(() => {\n\t\tif (!projectSlug) {\n\t\t\treturn new Set()\n\t\t}\n\t\tconst targetProject = identity?.projects.find(project => project.slug === projectSlug)\n\t\tif (targetProject === undefined) {\n\t\t\treturn new Set()\n\t\t}\n\n\t\treturn new Set(targetProject.roles)\n\t}, [identity?.projects, projectSlug])\n}\n"],"names":["useIdentity","useProjectSlug","useMemo"],"mappings":";;;;;AAMO,MAAM,sBAAsB,MAAwB;AAC1D,QAAM,WAAWA,SAAAA;AACjB,QAAM,cAAcC,YAAAA;AACpB,SAAOC,cAAQ,MAAM;AACpB,QAAI,CAAC,aAAa;AACjB,iCAAW,IAAI;AAAA,IAChB;AACA,UAAM,gBAAgB,UAAU,SAAS,KAAK,CAAW,YAAA,QAAQ,SAAS,WAAW;AACrF,QAAI,kBAAkB,QAAW;AAChC,iCAAW,IAAI;AAAA,IAChB;AAEO,WAAA,IAAI,IAAI,cAAc,KAAK;AAAA,EAChC,GAAA,CAAC,UAAU,UAAU,WAAW,CAAC;AACrC;;"}
@@ -0,0 +1,21 @@
1
+ import { useMemo } from "react";
2
+ import { useProjectSlug } from "@contember/react-client";
3
+ import { useIdentity } from "../internal/contexts.js";
4
+ const useProjectUserRoles = () => {
5
+ const identity = useIdentity();
6
+ const projectSlug = useProjectSlug();
7
+ return useMemo(() => {
8
+ if (!projectSlug) {
9
+ return /* @__PURE__ */ new Set();
10
+ }
11
+ const targetProject = identity?.projects.find((project) => project.slug === projectSlug);
12
+ if (targetProject === void 0) {
13
+ return /* @__PURE__ */ new Set();
14
+ }
15
+ return new Set(targetProject.roles);
16
+ }, [identity?.projects, projectSlug]);
17
+ };
18
+ export {
19
+ useProjectUserRoles
20
+ };
21
+ //# sourceMappingURL=useProjectUserRoles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjectUserRoles.js","sources":["../../../src/hooks/useProjectUserRoles.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { useProjectSlug } from '@contember/react-client'\nimport { useIdentity } from '../internal/contexts'\n\nexport type ProjectUserRoles = Set<string>\n\nexport const useProjectUserRoles = (): ProjectUserRoles => {\n\tconst identity = useIdentity()\n\tconst projectSlug = useProjectSlug()\n\treturn useMemo(() => {\n\t\tif (!projectSlug) {\n\t\t\treturn new Set()\n\t\t}\n\t\tconst targetProject = identity?.projects.find(project => project.slug === projectSlug)\n\t\tif (targetProject === undefined) {\n\t\t\treturn new Set()\n\t\t}\n\n\t\treturn new Set(targetProject.roles)\n\t}, [identity?.projects, projectSlug])\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,sBAAsB,MAAwB;AAC1D,QAAM,WAAW;AACjB,QAAM,cAAc;AACpB,SAAO,QAAQ,MAAM;AACpB,QAAI,CAAC,aAAa;AACjB,iCAAW,IAAI;AAAA,IAChB;AACA,UAAM,gBAAgB,UAAU,SAAS,KAAK,CAAW,YAAA,QAAQ,SAAS,WAAW;AACrF,QAAI,kBAAkB,QAAW;AAChC,iCAAW,IAAI;AAAA,IAChB;AAEO,WAAA,IAAI,IAAI,cAAc,KAAK;AAAA,EAChC,GAAA,CAAC,UAAU,UAAU,WAAW,CAAC;AACrC;"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const HasRole = require("./components/HasRole.cjs");
4
+ const IdentityProvider = require("./components/IdentityProvider.cjs");
5
+ const IdentityState = require("./components/IdentityState.cjs");
6
+ const LogoutTrigger = require("./components/LogoutTrigger.cjs");
7
+ const contexts = require("./internal/contexts.cjs");
8
+ const useLogout = require("./hooks/useLogout.cjs");
9
+ const useFetchIdentity = require("./hooks/useFetchIdentity.cjs");
10
+ const useProjectUserRoles = require("./hooks/useProjectUserRoles.cjs");
11
+ const IdentityEnvironmentExtension = require("./environment/IdentityEnvironmentExtension.cjs");
12
+ const ProjectEnvironmentExtension = require("./environment/ProjectEnvironmentExtension.cjs");
13
+ exports.HasRole = HasRole.HasRole;
14
+ exports.IdentityProvider = IdentityProvider.IdentityProvider;
15
+ exports.IdentityState = IdentityState.IdentityState;
16
+ exports.LogoutTrigger = LogoutTrigger.LogoutTrigger;
17
+ exports.useIdentity = contexts.useIdentity;
18
+ exports.useIdentityMethods = contexts.useIdentityMethods;
19
+ exports.useIdentityState = contexts.useIdentityState;
20
+ exports.useLogout = useLogout.useLogout;
21
+ exports.useFetchIdentity = useFetchIdentity.useFetchIdentity;
22
+ exports.useProjectUserRoles = useProjectUserRoles.useProjectUserRoles;
23
+ exports.identityEnvironmentExtension = IdentityEnvironmentExtension.identityEnvironmentExtension;
24
+ exports.projectEnvironmentExtension = ProjectEnvironmentExtension.projectEnvironmentExtension;
25
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,25 @@
1
+ import { HasRole } from "./components/HasRole.js";
2
+ import { IdentityProvider } from "./components/IdentityProvider.js";
3
+ import { IdentityState } from "./components/IdentityState.js";
4
+ import { LogoutTrigger } from "./components/LogoutTrigger.js";
5
+ import { useIdentity, useIdentityMethods, useIdentityState } from "./internal/contexts.js";
6
+ import { useLogout } from "./hooks/useLogout.js";
7
+ import { useFetchIdentity } from "./hooks/useFetchIdentity.js";
8
+ import { useProjectUserRoles } from "./hooks/useProjectUserRoles.js";
9
+ import { identityEnvironmentExtension } from "./environment/IdentityEnvironmentExtension.js";
10
+ import { projectEnvironmentExtension } from "./environment/ProjectEnvironmentExtension.js";
11
+ export {
12
+ HasRole,
13
+ IdentityProvider,
14
+ IdentityState,
15
+ LogoutTrigger,
16
+ identityEnvironmentExtension,
17
+ projectEnvironmentExtension,
18
+ useFetchIdentity,
19
+ useIdentity,
20
+ useIdentityMethods,
21
+ useIdentityState,
22
+ useLogout,
23
+ useProjectUserRoles
24
+ };
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactUtils = require("@contember/react-utils");
4
+ const [IdentityContext, useIdentity] = reactUtils.createContext("IdentityContext", void 0);
5
+ const [IdentityMethodsContext, useIdentityMethods] = reactUtils.createRequiredContext("IdentityMethodsContext");
6
+ const [IdentityStateContext, useIdentityState] = reactUtils.createRequiredContext("IdentityStateContext");
7
+ exports.IdentityContext = IdentityContext;
8
+ exports.IdentityMethodsContext = IdentityMethodsContext;
9
+ exports.IdentityStateContext = IdentityStateContext;
10
+ exports.useIdentity = useIdentity;
11
+ exports.useIdentityMethods = useIdentityMethods;
12
+ exports.useIdentityState = useIdentityState;
13
+ //# sourceMappingURL=contexts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.cjs","sources":["../../../src/internal/contexts.ts"],"sourcesContent":["import { createContext, createRequiredContext } from '@contember/react-utils'\nimport { IdentityMethods } from '../types/IdentityMethods'\nimport { Identity } from '../types/Identity'\nimport { IdentityStateValue } from '../types/IdentityStateValue'\n\nexport const [IdentityContext, useIdentity] = createContext<Identity | undefined>('IdentityContext', undefined)\nexport const [IdentityMethodsContext, useIdentityMethods] = createRequiredContext<IdentityMethods>('IdentityMethodsContext')\nexport const [IdentityStateContext, useIdentityState] = createRequiredContext<IdentityStateValue>('IdentityStateContext')\n"],"names":["createContext","createRequiredContext"],"mappings":";;;AAKO,MAAM,CAAC,iBAAiB,WAAW,IAAIA,WAAA,cAAoC,mBAAmB,MAAS;AACvG,MAAM,CAAC,wBAAwB,kBAAkB,IAAIC,WAAAA,sBAAuC,wBAAwB;AACpH,MAAM,CAAC,sBAAsB,gBAAgB,IAAIA,WAAAA,sBAA0C,sBAAsB;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import { createContext, createRequiredContext } from "@contember/react-utils";
2
+ const [IdentityContext, useIdentity] = createContext("IdentityContext", void 0);
3
+ const [IdentityMethodsContext, useIdentityMethods] = createRequiredContext("IdentityMethodsContext");
4
+ const [IdentityStateContext, useIdentityState] = createRequiredContext("IdentityStateContext");
5
+ export {
6
+ IdentityContext,
7
+ IdentityMethodsContext,
8
+ IdentityStateContext,
9
+ useIdentity,
10
+ useIdentityMethods,
11
+ useIdentityState
12
+ };
13
+ //# sourceMappingURL=contexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.js","sources":["../../../src/internal/contexts.ts"],"sourcesContent":["import { createContext, createRequiredContext } from '@contember/react-utils'\nimport { IdentityMethods } from '../types/IdentityMethods'\nimport { Identity } from '../types/Identity'\nimport { IdentityStateValue } from '../types/IdentityStateValue'\n\nexport const [IdentityContext, useIdentity] = createContext<Identity | undefined>('IdentityContext', undefined)\nexport const [IdentityMethodsContext, useIdentityMethods] = createRequiredContext<IdentityMethods>('IdentityMethodsContext')\nexport const [IdentityStateContext, useIdentityState] = createRequiredContext<IdentityStateValue>('IdentityStateContext')\n"],"names":[],"mappings":";AAKO,MAAM,CAAC,iBAAiB,WAAW,IAAI,cAAoC,mBAAmB,MAAS;AACvG,MAAM,CAAC,wBAAwB,kBAAkB,IAAI,sBAAuC,wBAAwB;AACpH,MAAM,CAAC,sBAAsB,gBAAgB,IAAI,sBAA0C,sBAAsB;"}