@spotify/backstage-plugin-rbac 0.6.2 → 0.6.3
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.
- package/CHANGELOG.md +11 -0
- package/alpha/package.json +2 -2
- package/dist/alpha/apis.esm.js +2 -0
- package/dist/alpha/pages.esm.js +2 -0
- package/dist/alpha/plugin.esm.js +2 -0
- package/dist/alpha.esm.js +1 -1
- package/dist/api.esm.js +2 -0
- package/dist/components/Auth/Authorized.esm.js +2 -0
- package/dist/components/ConfirmationDialog/ConfirmationDialog.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/AddConditionSelector.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionCard.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTree.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionTypeSelector.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/ConditionalDecisionForm.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionLevelSummary.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionSummary.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/ConditionalDecisionBox.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/Indent.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/CriteriaSummary/MonospaceText.esm.js +2 -0
- package/dist/components/DecisionDialog/ConditionalDecisionForm/utils.esm.js +2 -0
- package/dist/components/DecisionDialog/DecisionDialog.esm.js +2 -0
- package/dist/components/DecisionDialog/MatchByActions.esm.js +2 -0
- package/dist/components/DecisionDialog/MatchByName.esm.js +2 -0
- package/dist/components/DecisionDialog/MatchByResourceType.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsForm.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormArrayInput.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormBooleanInput.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormInput.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormInputRouter.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormJSONEditor.esm.js +2 -0
- package/dist/components/DecisionDialog/ParamsForm/ParamsFormStandard.esm.js +2 -0
- package/dist/components/DecisionDialog/ToggleButton.esm.js +2 -0
- package/dist/components/DecisionDialog/ToggleButtonGroup.esm.js +2 -0
- package/dist/components/DecisionDialog/VerticalSelection.esm.js +2 -0
- package/dist/components/DecisionDialog/computeMatchResult.esm.js +2 -0
- package/dist/components/DecisionDialog/conditionConstants.esm.js +2 -0
- package/dist/components/DecisionDialog/decisionDataMappers.esm.js +2 -0
- package/dist/components/DecisionDialog/utils.esm.js +2 -0
- package/dist/components/Diffing/DiffBadge.esm.js +2 -0
- package/dist/components/Diffing/DiffSummary.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/getMembersDiff.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/getOptionsDiff.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/getPermissionsDiff.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/getPolicyDiff.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/getRolesDiff.esm.js +2 -0
- package/dist/components/Diffing/getPolicyDiff/utils.esm.js +2 -0
- package/dist/components/Diffing/usePolicyDiff.esm.js +2 -0
- package/dist/components/Diffing/utils.esm.js +2 -0
- package/dist/components/EditableInput/EditableInput.esm.js +2 -0
- package/dist/components/Home/HomePage.esm.js +2 -0
- package/dist/components/Home/HomePageContent.esm.js +2 -0
- package/dist/components/Home/HomePageEmptyState.esm.js +2 -0
- package/dist/components/Layout/Breadcrumbs.esm.js +2 -0
- package/dist/components/Layout/EmptyStateImageWrapper.esm.js +2 -0
- package/dist/components/Layout/PageWrapper.esm.js +2 -0
- package/dist/components/Layout/Title.esm.js +2 -0
- package/dist/components/Members/MemberOptionsProvider.esm.js +2 -0
- package/dist/components/Members/MembersAutocomplete.esm.js +2 -0
- package/dist/components/Members/MembersAutocompleteListBox.esm.js +2 -0
- package/dist/components/Members/MembersTable.esm.js +2 -0
- package/dist/components/Members/MembersTableBody.esm.js +2 -0
- package/dist/components/Permission/PermissionName.esm.js +2 -0
- package/dist/components/Permissions/PermissionsMetadataContext.esm.js +2 -0
- package/dist/components/Permissions/PermissionsTable.esm.js +2 -0
- package/dist/components/Permissions/utils.esm.js +2 -0
- package/dist/components/Policies/PoliciesProvider.esm.js +2 -0
- package/dist/components/Policies/PoliciesTable.esm.js +2 -0
- package/dist/components/Policies/useFetchPolicies.esm.js +2 -0
- package/dist/components/Policy/EmptyRolesCard.esm.js +2 -0
- package/dist/components/Policy/PolicyCard.esm.js +2 -0
- package/dist/components/Policy/PolicyConflictDialog.esm.js +2 -0
- package/dist/components/Policy/PolicyImportButton.esm.js +2 -0
- package/dist/components/Policy/PolicyInvalidDialog.esm.js +2 -0
- package/dist/components/Policy/PolicyMenu.esm.js +2 -0
- package/dist/components/Policy/PolicyOptionCard.esm.js +2 -0
- package/dist/components/Policy/PolicyOptionsPage.esm.js +2 -0
- package/dist/components/Policy/PolicyPage.esm.js +2 -0
- package/dist/components/Policy/PolicyProvider.esm.js +2 -0
- package/dist/components/Policy/PolicyPublishButton.esm.js +2 -0
- package/dist/components/Policy/PolicyPublishConfirmationDialog.esm.js +2 -0
- package/dist/components/Policy/PolicyPublishSuccessDialog.esm.js +2 -0
- package/dist/components/Policy/PolicyStatusChip.esm.js +2 -0
- package/dist/components/Policy/exportPolicy.esm.js +3 -0
- package/dist/components/Policy/getActivityDescriptions.esm.js +2 -0
- package/dist/components/Policy/getLatestPolicy.esm.js +2 -0
- package/dist/components/Policy/useDeleteDraftPolicy.esm.js +2 -0
- package/dist/components/Policy/useDuplicatePolicy.esm.js +2 -0
- package/dist/components/Policy/useLocalDraftPolicy.esm.js +2 -0
- package/dist/components/Policy/usePublishPolicy.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/CellText.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecidingRoleCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionBreakdownTable.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/DecisionCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/PermissionNameCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/RoleNameCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/TableHeaderCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionBreakdownTable/UserIconCell.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionIcon.esm.js +2 -0
- package/dist/components/PolicyTester/DecisionInfo.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTestResultDetails.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTester.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTesterFieldset.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTesterPermissionSelect.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTesterResultRow.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTesterResults.esm.js +2 -0
- package/dist/components/PolicyTester/PolicyTesterRoleSelect.esm.js +2 -0
- package/dist/components/PolicyTester/StatusChip.esm.js +2 -0
- package/dist/components/PolicyTester/usePolicyTestResult.esm.js +2 -0
- package/dist/components/PolicyTester/usePolicyTesterLocalStorageStrings.esm.js +2 -0
- package/dist/components/RBACSidebarItem.esm.js +2 -0
- package/dist/components/RelativeTime/RelativeTime.esm.js +2 -0
- package/dist/components/ReorderControls/ReorderControls.esm.js +2 -0
- package/dist/components/ReorderControls/ReorderInfo.esm.js +2 -0
- package/dist/components/ReorderControls/shiftPositionInArray.esm.js +2 -0
- package/dist/components/Role/RolePage.esm.js +2 -0
- package/dist/components/Roles/RolesTable.esm.js +2 -0
- package/dist/components/Root.esm.js +2 -0
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +2 -0
- package/dist/routes.esm.js +2 -0
- package/dist/utils/assert.esm.js +2 -0
- package/dist/utils/errors.esm.js +2 -0
- package/dist/utils/getZodValidationToKeyMap.esm.js +2 -0
- package/package.json +31 -23
- package/dist/esm/Authorized-BwbJLswg.esm.js +0 -2
- package/dist/esm/RBACSidebarItem-DRxQHRoM.esm.js +0 -2
- package/dist/esm/Root-DUzXpmaE.esm.js +0 -3
- package/dist/esm/routes-DldYB8_w.esm.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Progress as Z,ErrorPanel as _}from"@backstage/core-components";import{useApi as D,alertApiRef as ee,useApp as oe}from"@backstage/core-plugin-api";import{PolicyConfigParser as x}from"@spotify/backstage-plugin-rbac-common";import t,{createContext as re,useContext as te,useState as A,useCallback as f,useEffect as L}from"react";import{useNavigate as ie}from"react-router-dom";import le from"react-use/lib/useAsyncFn";import{v4 as ae}from"uuid";import{rbacApiRef as ce}from"../../api.esm.js";import{isNotFoundError as se}from"../../utils/errors.esm.js";import{usePolicyDiff as ne}from"../Diffing/usePolicyDiff.esm.js";import{usePoliciesContext as me}from"../Policies/PoliciesProvider.esm.js";import{exportPolicy as pe}from"./exportPolicy.esm.js";import{getLatestPolicy as ue}from"./getLatestPolicy.esm.js";import{PolicyConflictDialog as fe}from"./PolicyConflictDialog.esm.js";import{PolicyInvalidDialog as Pe}from"./PolicyInvalidDialog.esm.js";import{PolicyPublishConfirmationDialog as ye}from"./PolicyPublishConfirmationDialog.esm.js";import{PolicyPublishSuccessDialog as de}from"./PolicyPublishSuccessDialog.esm.js";import{useLocalDraftPolicy as ve}from"./useLocalDraftPolicy.esm.js";import{usePublishPolicy as he}from"./usePublishPolicy.esm.js";const S={canPublish:!1,diff:null,hasChanges:!1,isValid:!1,policy:void 0,createNewRole:()=>"",discardLocalDraft:()=>{},exportPolicy:()=>{},publish:()=>{},saveLocalDraftToServer:()=>Promise.reject(),saveAndPublish:()=>Promise.reject(),refetchPolicy:()=>Promise.reject(),updateLocalDraft:()=>{}},N=re(S),ge=()=>te(N);function Ce({children:R,policyId:P}){const j=ie(),y=D(ee),n=D(ce),{getPolicy:$,setPolicy:h}=me(),k=oe(),{NotFoundErrorPage:F}=k.getComponents(),[d,l]=A({active:!1,update:!1}),[I,g]=A(!1),[{loading:T,value:m},C]=he(),r=$(P),[p,u,a]=ve(),E=!p||x.safeParse(p).success,c=E?p:void 0,{policy:e,policyConflict:V}=ue({serverPolicy:r,localPolicy:c}),O=ne(e),b=x.safeParse(e).success,U=b&&!c&&!T,[{loading:q,error:v},w]=le(()=>n.getPolicy(P),[n,P],r?{loading:!1,value:r}:{loading:!0}),z=()=>{l({active:!0,update:!1})},B=()=>{l({active:!0,update:!0})},i=f(async()=>{const o=await w();h(o)},[w,h]),G=f(async o=>{await C(e,o,d.update?e:void 0),l({active:!1,update:!1}),i?.()},[e,d,C,l,i]),H=async()=>{g(!1)},J=()=>{u(o=>o&&r&&{...o,updatedAt:r.updatedAt})},K=f(async()=>{if(!e)throw new Error("No policy to save");try{await n.updateDraft(e.id,{name:e.name,roles:e.roles,options:e.options}),y.post({message:"Policy saved",severity:"success"}),a(),i?.()}catch(o){y.post({message:o?.message||"An error occurred while updating the policy",severity:"error"})}},[y,n,e,i,a]),M=f(()=>{if(!e)throw new Error("No policy to create a new role");const o=new Set(e.roles.map(Y=>Y.id));let s;do s=ae().split("-")[0];while(o.has(s));const X={name:`Role ${s}`,permissions:[],members:"*",id:s};return u({...e,roles:[...e.roles,X]}),s},[e,u]),Q=()=>{a(),j("/rbac")},W=()=>{e&&pe(e)};return L(()=>{r||i()},[i,r]),L(()=>{m&&g(!0)},[m]),E?e?t.createElement(N.Provider,{value:{canPublish:U,diff:O,hasChanges:!!c,isValid:b,policy:e,createNewRole:M,discardLocalDraft:a,exportPolicy:W,publish:z,saveLocalDraftToServer:K,refetchPolicy:i,updateLocalDraft:u,saveAndPublish:B}},V&&c&&r&&t.createElement(fe,{localPolicy:c,onSelectLocalPolicy:J,onSelectServerPolicy:a,serverPolicy:r}),t.createElement(ye,{open:d.active,onClose:()=>l({active:!1,update:!1}),onPublish:G,policy:e}),m&&t.createElement(de,{isOpen:I,onClose:H,policy:m}),R):q?t.createElement(Z,null):v?se(v)?t.createElement(F,null):t.createElement(_,{error:v??new Error("Unknown")}):null:t.createElement(Pe,{onConfirm:Q,policy:p})}export{Ce as PolicyProvider,S as defaultContext,ge as usePolicyContext};
|
|
2
|
+
//# sourceMappingURL=PolicyProvider.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Button as h}from"@material-ui/core";import{PolicyConfigParser as y}from"@spotify/backstage-plugin-rbac-common";import o,{useState as b}from"react";import{useFetchPolicies as C}from"../Policies/useFetchPolicies.esm.js";import{usePolicyContext as g}from"./PolicyProvider.esm.js";import{PolicyPublishConfirmationDialog as E}from"./PolicyPublishConfirmationDialog.esm.js";import{PolicyPublishSuccessDialog as d}from"./PolicyPublishSuccessDialog.esm.js";import{usePublishPolicy as x}from"./usePublishPolicy.esm.js";const B=l=>{const[s,e]=b(!1),{fetchPolicies:r}=C(),[{loading:c,value:t},n]=x(),{policy:i,hasChanges:m}=g(),a=y.safeParse(i).success,u=!m&&a,P=async f=>{await n(i,f),e(!1)},p=()=>{r()};return o.createElement(o.Fragment,null,o.createElement(h,{...l,onClick:()=>e(!0),disabled:!u||c},"Publish"),o.createElement(E,{open:s,onClose:()=>e(!1),onPublish:P,policy:i}),t&&o.createElement(d,{isOpen:!0,onClose:p,policy:t}))};export{B as PolicyPublishButton};
|
|
2
|
+
//# sourceMappingURL=PolicyPublishButton.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as p,Dialog as f,DialogTitle as y,Box as d,Button as r,Typography as h,DialogContent as s,TextField as g,DialogActions as E,CircularProgress as b}from"@material-ui/core";import C from"@material-ui/icons/Close";import e,{useState as k,useRef as v}from"react";import{DiffSummary as D}from"../Diffing/DiffSummary.esm.js";const B=p(t=>({closeButton:{color:t.palette.text.secondary},diffSummaryContainer:{backgroundColor:t.palette.background.default,marginBottom:t.spacing(2)}}));function P({open:t,onPublish:c,onClose:l,policy:m}){const[o,n]=k(!1),a=B(),i=v(null),u=async()=>{n(!0),await c(i.current?.value??""),n(!1)};return e.createElement(f,{open:t,onClose:l,fullWidth:!0},e.createElement(y,null,e.createElement(d,{display:"flex",justifyContent:"space-between",alignItems:"center"},"Ready to publish?",e.createElement(r,{startIcon:e.createElement(C,null),onClick:l,className:a.closeButton},"Close")),e.createElement(h,null,"Double check your changes, then click Publish to activate this version of your policy. This will immediately apply the permissions defined in this version across Backstage.")),e.createElement(s,{className:a.diffSummaryContainer,dividers:!0},e.createElement(D,{policy:m})),e.createElement(s,null,e.createElement(g,{variant:"outlined",fullWidth:!0,label:"Summary (optional)",placeholder:"Briefly describe this version (or changes from a previous version)",inputRef:i})),e.createElement(E,null,e.createElement(r,{color:"primary",onClick:u,disabled:o},o?e.createElement(b,{size:20}):"Publish")))}export{P as PolicyPublishConfirmationDialog};
|
|
2
|
+
//# sourceMappingURL=PolicyPublishConfirmationDialog.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as a,Dialog as c,DialogTitle as m,Box as l,Typography as r,IconButton as s,DialogContent as p,DialogActions as u,Button as y}from"@material-ui/core";import E from"@material-ui/icons/Close";import e from"react";import{Link as f}from"react-router-dom";import{PolicyCard as g}from"./PolicyCard.esm.js";const d=a(t=>({paper:{padding:t.spacing(2,2,0,2)}})),x=({isOpen:t,onClose:o,policy:n})=>{const i=d();return e.createElement(c,{classes:{...i},open:t,onClose:o},e.createElement(m,{disableTypography:!0},e.createElement(l,{display:"flex",flexDirection:"row"},e.createElement(l,null,e.createElement(r,{variant:"h4",component:"h2"},"Success!"),e.createElement(r,null,n.name," has been published and is now your active policy.")),e.createElement(l,null,e.createElement(s,{onClick:o,title:"Close dialog"},e.createElement(E,null))))),e.createElement(p,null,e.createElement(g,{policy:n})),e.createElement(u,null,e.createElement(l,{display:"flex",flexDirection:"row",flexGrow:1,justifyContent:"flex-start"},e.createElement(y,{component:f,color:"primary",onClick:o,role:"link",to:"/rbac"},"View all versions"))))};export{x as PolicyPublishSuccessDialog};
|
|
2
|
+
//# sourceMappingURL=PolicyPublishSuccessDialog.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as a,Chip as s}from"@material-ui/core";import i from"@material-ui/icons/FiberManualRecord";import c from"react";const o=a(e=>({chip:{margin:0},icon:{color:e.palette.success.main}}));function l(e){const t=o();return e.status==="inactive"?null:e.status==="draft"?c.createElement(s,{className:t.chip,label:"Draft",size:e.size}):c.createElement(s,{className:t.chip,classes:{icon:t.icon},label:"Active",icon:c.createElement(i,null),size:e.size})}export{l as PolicyStatusChip};
|
|
2
|
+
//# sourceMappingURL=PolicyStatusChip.esm.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{saveAs as l}from"file-saver";import{dump as c}from"js-yaml";import t from"lodash/omit";import d from"lodash/pickBy";function f(o){const e=new Blob([n(o)],{type:"text/yaml"});l(e,`${(o.name||"policy").toLocaleLowerCase().replace(/\W/g,"-")}.yaml`)}function n(o){const{name:e,roles:r,options:m,description:p}=o;return`# this is an autogenerated file, do not edit
|
|
2
|
+
${c(d({name:e,description:p,options:m,roles:r.map(({permissions:i,...s})=>({...t(s,["id"]),permissions:i.map(a=>t(a,["id"]))}))},i=>i!==null||i!==void 0))}`}export{f as exportPolicy,n as policyToYaml};
|
|
3
|
+
//# sourceMappingURL=exportPolicy.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function c(e,d,a){let i=d.created,t=e.createdBy;a?.created&&(t=a.created+t);let u=e.createdAt;return e.status==="active"?(i=d.published,t=e.lastPublishedBy??"",a?.published&&(t=a.published+t),u=e.lastPublishedAt??""):e.createdAt!==e.updatedAt&&(i=d.updated,t=e.updatedBy,a?.updated&&(t=a.updated+t),u=e.updatedAt),{activityDateText:i,activityUser:t,timestamp:u}}export{c as getActivityDescription};
|
|
2
|
+
//# sourceMappingURL=getActivityDescriptions.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const l=({serverPolicy:o,localPolicy:c})=>!c||!o?{policy:o,policyConflict:!1}:o.status!=="draft"?{policy:o,policyConflict:!1}:c.id!==o.id?{policy:o,policyConflict:!1}:c.updatedAt===o.updatedAt?{policy:c,policyConflict:!1}:{policy:c,policyConflict:!0};export{l as getLatestPolicy};
|
|
2
|
+
//# sourceMappingURL=getLatestPolicy.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useApi as t,alertApiRef as c}from"@backstage/core-plugin-api";import m from"react-use/lib/useAsyncFn";import{rbacApiRef as f}from"../../api.esm.js";import{useFetchPolicies as p}from"../Policies/useFetchPolicies.esm.js";function a(e){const i=t(f),o=t(c),{fetchPolicies:s}=p();return m(async()=>{if(e)return i.deleteDraft(e.id).then(s).catch(r=>(o.post({message:r.message,severity:"error"}),Promise.reject(r)))},[e])}export{a as useDeleteDraftPolicy};
|
|
2
|
+
//# sourceMappingURL=useDeleteDraftPolicy.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useApi as a,alertApiRef as f}from"@backstage/core-plugin-api";import{useNavigate as p}from"react-router-dom";import u from"react-use/lib/useAsyncFn";import{rbacApiRef as l}from"../../api.esm.js";import{useFetchPolicies as h}from"../Policies/useFetchPolicies.esm.js";function y(){const e=a(l),o=a(f),t=p(),{fetchPolicies:i}=h();return u(async s=>{if(!s)return;const{roles:c,name:n,options:m}=s;try{const r=await e.createDraft({roles:c,options:m,name:n});return await i(),t(`/rbac/versions/${r.id}`),r}catch(r){throw r instanceof Error&&o.post({message:r.message,severity:"error"}),r}},[t,e,o,i])}export{y as useDuplicatePolicy};
|
|
2
|
+
//# sourceMappingURL=useDuplicatePolicy.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useApi as s,alertApiRef as f}from"@backstage/core-plugin-api";import{useEffect as c}from"react";import u from"react-use/lib/useAsyncFn";import{rbacApiRef as a}from"../../api.esm.js";function n(){const e=s(a),o=s(f),t=u(async(i,p,m)=>{if(i)return await e.publishPolicy(i.id,{description:p,update:m}),e.getPolicy(i.id)},[]),[{error:r}]=t;return c(()=>{r&&o.post({message:r.message,severity:"error"})},[r,o]),t}export{n as usePublishPolicy};
|
|
2
|
+
//# sourceMappingURL=usePublishPolicy.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as n,Typography as r}from"@material-ui/core";import i from"react";const c=n(()=>({decisionRowCell:{fontWeight:"bold"}})),s=({children:o,ledToDecision:e,color:t})=>{const l=c();return i.createElement(r,{variant:"body1",component:"span",classes:{root:e?l.decisionRowCell:void 0},color:t},o)};export{s as CellText};
|
|
2
|
+
//# sourceMappingURL=CellText.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AuthorizeResult as c}from"@backstage/plugin-permission-common";import{makeStyles as p,Box as E,TableContainer as T,Table as b,TableHead as f,TableRow as u,TableBody as h,TableCell as a}from"@material-ui/core";import{getMatchingRolePermissions as D,isConditionalDecision as R}from"@spotify/backstage-plugin-rbac-common";import e,{useMemo as w}from"react";import{DecidingRoleCell as g}from"./DecidingRoleCell.esm.js";import{DecisionCell as C}from"./DecisionCell.esm.js";import{PermissionNameCell as k}from"./PermissionNameCell.esm.js";import{RoleNameCell as z}from"./RoleNameCell.esm.js";import{TableHeaderCell as s}from"./TableHeaderCell.esm.js";import{UserIconCell as y}from"./UserIconCell.esm.js";const N=p(o=>({tableContainer:{border:`1px solid ${o.palette.border}`,borderRadius:o.shape.borderRadius},tableRow:{"&, &:nth-child(odd)":{background:o.palette.background.paper}},decisionTableRow:{"&, &:nth-child(odd)":{background:o.palette.type==="light"?o.palette.infoBackground:o.palette.grey[900]}}})),I=o=>{if(R(o))return c.CONDITIONAL;if(typeof o=="string")switch(o){case"allow":return c.ALLOW;case"deny":return c.DENY;default:throw new Error(`Unknown decision: ${o}`)}throw new Error("Unknown decision type found.")},B=(o,t)=>t.some(r=>r.rolePermissionId===o.id),P=o=>w(()=>{const{roles:t,permission:r,decisionOrigin:l}=o,n=[];for(const i of t){const m=D(i,r);if(m.length>0)for(const d of m)n.push({role:i,permission:r,authorizeResult:I(d.decision),ledToDecision:B(d,l)});else n.push({role:i,permission:r,authorizeResult:null,ledToDecision:!1})}return n},[o]),O=({resultRow:o})=>{const t=N(),r=P(o);return e.createElement(E,{marginTop:3,marginBottom:3},e.createElement(T,{classes:{root:t.tableContainer}},e.createElement(b,null,e.createElement(f,null,e.createElement(u,{classes:{root:t.tableRow}},e.createElement(s,null),e.createElement(s,null,"Role"),e.createElement(s,null,"Permission"),e.createElement(s,null,"Decision"),e.createElement(s,null,"Is deciding role"))),e.createElement(h,null,r.map((l,n)=>{const i=n===0;return e.createElement(u,{key:n,classes:{root:l.ledToDecision?t.decisionTableRow:t.tableRow}},i?e.createElement(y,{rowCount:r.length}):null,e.createElement(a,{size:"small"},e.createElement(z,{role:l.role,ledToDecision:l.ledToDecision})),e.createElement(a,{size:"small"},e.createElement(k,{permissionName:l.permission.name,ledToDecision:l.ledToDecision})),e.createElement(a,{size:"small"},e.createElement(C,{authorizeResult:l.authorizeResult,ledToDecision:l.ledToDecision})),e.createElement(a,{size:"small"},e.createElement(g,{ledToDecision:l.ledToDecision})))})))))};export{O as DecisionBreakdownTable};
|
|
2
|
+
//# sourceMappingURL=DecisionBreakdownTable.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AuthorizeResult as n}from"@backstage/plugin-permission-common";import{makeStyles as r}from"@material-ui/core";import t from"react";import{DecisionIcon as c}from"../DecisionIcon.esm.js";import{CellText as l}from"./CellText.esm.js";const s=r(e=>({decisionCell:{display:"flex",justifyItems:"center"},decisionIconContainer:{display:"flex",alignItems:"center",marginRight:e.spacing(1)},decisionIconAllow:{color:e.palette.success.main},decisionIconDeny:{color:e.palette.error.main},decisionIconConditional:{color:e.palette.info.main}})),a=e=>{switch(e){case n.ALLOW:return"Allow";case n.DENY:return"Deny";case n.CONDITIONAL:return"Conditional";default:return"Permission not found in role"}},m=(e,o)=>{let i;switch(e){case n.ALLOW:i=o.decisionIconAllow;break;case n.DENY:i=o.decisionIconDeny;break;case n.CONDITIONAL:i=o.decisionIconConditional;break;default:return}return`${o.decisionIconContainer} ${i}`},d=({ledToDecision:e,authorizeResult:o})=>{const i=s();return t.createElement("div",{className:i.decisionCell},o!==null&&t.createElement("span",{className:m(o,i)},t.createElement(c,{authorizeResult:o,size:"small"})),t.createElement(l,{ledToDecision:e,color:e===!1?"textSecondary":void 0},a(o)))};export{d as DecisionCell};
|
|
2
|
+
//# sourceMappingURL=DecisionCell.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import o from"react";import{PermissionName as i}from"../../Permission/PermissionName.esm.js";import{CellText as r}from"./CellText.esm.js";const t=({permissionName:m,ledToDecision:e})=>o.createElement(r,{ledToDecision:e,color:e===!1?"textSecondary":void 0},o.createElement(i,{name:m}));export{t as PermissionNameCell};
|
|
2
|
+
//# sourceMappingURL=PermissionNameCell.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Link as l}from"@backstage/core-components";import o from"react";import{CellText as m}from"./CellText.esm.js";const t=({role:e,ledToDecision:r})=>o.createElement(l,{to:`roles/${e.id}`},o.createElement(m,{ledToDecision:r,color:"primary"},e.name));export{t as RoleNameCell};
|
|
2
|
+
//# sourceMappingURL=RoleNameCell.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as r,TableCell as t}from"@material-ui/core";import o from"react";const a=r(e=>({tableHeader:{borderBottom:`1px solid ${e.palette.border}`}})),s=({children:e})=>{const l=a();return o.createElement(t,{size:"small",classes:{root:l.tableHeader}},e)};export{s as TableHeaderCell};
|
|
2
|
+
//# sourceMappingURL=TableHeaderCell.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{UserIcon as t}from"@backstage/core-components";import{makeStyles as l,TableCell as n}from"@material-ui/core";import o from"react";const a=l(e=>({userCell:{borderRight:`1px solid ${e.palette.border}`,color:e.palette.text.secondary,background:e.palette.background.paper}})),s=({rowCount:e})=>{const r=a();return o.createElement(n,{size:"small",padding:"none",align:"center",rowSpan:e,classes:{root:r.userCell}},o.createElement(t,null))};export{s as UserIconCell};
|
|
2
|
+
//# sourceMappingURL=UserIconCell.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AuthorizeResult as t}from"@backstage/plugin-permission-common";import i from"@material-ui/icons/AccountTreeOutlined";import n from"@material-ui/icons/CheckSharp";import m from"@material-ui/icons/NotInterested";import r from"react";const u=({authorizeResult:o,size:e})=>{switch(o){case t.ALLOW:return r.createElement(n,{fontSize:e});case t.DENY:return r.createElement(m,{fontSize:e});case t.CONDITIONAL:return r.createElement(i,{fontSize:e});default:return null}};export{u as DecisionIcon};
|
|
2
|
+
//# sourceMappingURL=DecisionIcon.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AuthorizeResult as c}from"@backstage/plugin-permission-common";import{makeStyles as u,Typography as p}from"@material-ui/core";import h from"@material-ui/icons/InfoOutlined";import{getMatchingRolePermissions as g}from"@spotify/backstage-plugin-rbac-common";import e from"react";import{PermissionName as i}from"../Permission/PermissionName.esm.js";import{usePolicyContext as f}from"../Policy/PolicyProvider.esm.js";const E=u(t=>({container:{display:"flex",flexDirection:"row",gap:t.spacing(1)},infoIcon:{color:t.palette.textSubtle}})),d=({policy:t,roles:o,permission:l})=>{const s=o.flatMap(n=>g(n,l));let r;if(o.length===0)r=e.createElement(e.Fragment,null,"A user with no assigned roles will be denied access to"," ",e.createElement("strong",null,e.createElement(i,{name:l.name})),".");else if(!s.length)r=e.createElement(e.Fragment,null,"None of the roles explicitly sets a rule for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:l.name})),", which means that a user who has all of these roles will be denied access to"," ",e.createElement("strong",null,e.createElement(i,{name:l.name})),".");else if(t.options.resolutionStrategy==="any-allow")r=e.createElement(e.Fragment,null,"None of the roles explicitly sets an allow or conditional rule for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:l.name})),". Since the resolution strategy for this policy is"," ",e.createElement("strong",null,"any-allow"),", a user who has all of these roles will be denied access to"," ",e.createElement("strong",null,e.createElement(i,{name:l.name})),".");else throw t.options.resolutionStrategy==="first-match"?new Error("Trying to render ImplicitDecisionInfo for a first-match policy that has matching role permission. This should not happen, since the decision should be explicit by the matching role permission."):new Error(`Unknown resolution strategy ${t.options.resolutionStrategy}. Cannot render ImplicitDecisionInfo.`);return e.createElement(e.Fragment,null,e.createElement("strong",null,"Implicit decision")," \u2013 ",r)},y=({policy:t,permission:o,roles:l,decision:s,decisionOrigin:r})=>{const n=l.find(m=>m.id===r[0].roleId);let a;if(t.options.resolutionStrategy==="first-match"){if(!n)throw new Error("Expected decision origin role for first-match explicit decision but found none.");a=e.createElement(e.Fragment,null,"The role ",e.createElement("strong",null,n.name)," explicitly sets a rule for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:o.name})),". Since the resolution strategy for this policy is"," ",e.createElement("strong",null,"first-match"),", no other roles are applied.")}else if(t.options.resolutionStrategy==="any-allow"){if(s.result===c.ALLOW){if(!n)throw new Error("Expected decision origin role for any-allow explicit allow decision but found none.");a=e.createElement(e.Fragment,null,"The role ",e.createElement("strong",null,n.name)," is the first role that explicitly sets an allow decision for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:o.name})),". Since the resolution strategy for this policy is"," ",e.createElement("strong",null,"any-allow"),", this decides the outcome.")}else if(s.result===c.CONDITIONAL)if(r.length===1){if(!n)throw new Error("Expected decision origin role for any-allow explicit allow decision but found none.");a=e.createElement(e.Fragment,null,"The role ",e.createElement("strong",null,n.name)," is the first role that explicitly sets a decision for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:o.name})),". Since the resolution strategy for this policy is"," ",e.createElement("strong",null,"any-allow"),", this decides the outcome.")}else a=e.createElement(e.Fragment,null,"Multiple roles explicitly set a rule for the permission"," ",e.createElement("strong",null,e.createElement(i,{name:o.name})),". Since the resolution strategy for this policy is"," ",e.createElement("strong",null,"any-allow"),", these decide the outcome.")}else throw new Error(`Unknown resolution strategy ${t.options.resolutionStrategy}. Cannot render ExplicitDecisionInfo.`);return e.createElement(e.Fragment,null,e.createElement("strong",null,"Explicit decision")," \u2013 ",a)},w=({roles:t,permission:o,decision:l,decisionOrigin:s})=>{const{policy:r}=f(),n=E();return e.createElement("div",{className:n.container},e.createElement(h,{fontSize:"small",titleAccess:"",className:n.infoIcon}),e.createElement(p,{variant:"body1",component:"p"},s.length===0?e.createElement(d,{policy:r,roles:t,permission:o}):e.createElement(y,{policy:r,permission:o,roles:t,decision:l,decisionOrigin:s})))};export{w as DecisionInfo};
|
|
2
|
+
//# sourceMappingURL=DecisionInfo.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AuthorizeResult as o}from"@backstage/plugin-permission-common";import{makeStyles as n,Typography as i}from"@material-ui/core";import t from"react";import{CriteriaSummary as s}from"../DecisionDialog/ConditionalDecisionForm/CriteriaSummary/CriteriaSummary.esm.js";import{getCriteria as a}from"../DecisionDialog/decisionDataMappers.esm.js";import{DecisionBreakdownTable as m}from"./DecisionBreakdownTable/DecisionBreakdownTable.esm.js";import{DecisionInfo as l}from"./DecisionInfo.esm.js";const c=n(e=>({heading:{fontWeight:"bold"},subtitle:{color:e.palette.text.secondary},criteriaSummarySpacing:{marginBottom:e.spacing(3)}})),p=({resultRow:e})=>{const r=c();return t.createElement(t.Fragment,null,e.roles.length>0?t.createElement(t.Fragment,null,t.createElement(i,{variant:"body1",component:"h6",className:r.heading},"Decision breakdown"),t.createElement(i,{variant:"subtitle1",component:"p",className:r.subtitle},"See what role results in this decision."),t.createElement(m,{resultRow:e})):null,e.decision.result===o.CONDITIONAL?t.createElement("div",{className:r.criteriaSummarySpacing},t.createElement(s,{permissionCriteria:a(e.decision.conditions)})):null,t.createElement(l,{roles:e.roles,permission:e.permission,decision:e.decision,decisionOrigin:e.decisionOrigin}))};export{p as PolicyTestResultDetails};
|
|
2
|
+
//# sourceMappingURL=PolicyTestResultDetails.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as N,Paper as b,Box as n,Typography as d,Button as f}from"@material-ui/core";import B from"@material-ui/icons/Clear";import e,{useMemo as h,useRef as I,useState as k,useEffect as L}from"react";import{usePermissions as M}from"../Permissions/PermissionsMetadataContext.esm.js";import{usePolicyContext as U}from"../Policy/PolicyProvider.esm.js";import{PolicyTesterFieldset as g}from"./PolicyTesterFieldset.esm.js";import{PolicyTesterPermissionSelect as W}from"./PolicyTesterPermissionSelect.esm.js";import{PolicyTesterResults as j}from"./PolicyTesterResults.esm.js";import{PolicyTesterRoleSelect as F}from"./PolicyTesterRoleSelect.esm.js";import{usePolicyTesterLocalStorageStrings as P}from"./usePolicyTesterLocalStorageStrings.esm.js";import{usePolicyTestResult as G}from"./usePolicyTestResult.esm.js";const $=N(t=>({bodyText:{margin:`${t.spacing(1)}px 0`},clearButton:{marginLeft:t.spacing(1)}}));function q(){const{policy:t}=U(),{permissions:a,isLoading:E}=M(),T=h(()=>t.roles.map(o=>o.id),[t.roles]),S=h(()=>a?.map(o=>o.name)||[],[a]),c=I(null),[m,p]=P("roleIds",T),[r,u]=P("permissionNames",S,E),[x,s]=k(""),[l,v,i]=G();L(()=>{i()},[t.roles,t.options,i]);const C=()=>{r.length===0?(c.current?.firstChild?.focus(),s("Please select at least one permission.")):v(m,r)},R=()=>{p([]),u([]),i(),s("")},y=$(),w=o=>{u(o),o.length>0&&s("")};return e.createElement(b,null,e.createElement(n,{justifyContent:"space-between",padding:2},e.createElement(d,{variant:"h3"},"Policy Tester"),e.createElement(d,{variant:"body1",component:"p",className:y.bodyText},"Use the policy tester to check if your changes will provide the access you intended for a user that has the roles you select below."),e.createElement(g,{title:"Which permissions do you want to test?"},e.createElement(W,{selectedPermissionNames:r,setSelectedPermissionNames:w,ref:c,errorMessage:x})),e.createElement(g,{title:"Which roles should the simulated user have?"},e.createElement(F,{selectedRoleIds:m,setSelectedRoleIds:p})),e.createElement(n,{marginTop:3,component:"section"},e.createElement(f,{onClick:C,variant:"contained",color:"primary"},"Run tests"),e.createElement(f,{className:y.clearButton,color:"primary",variant:"outlined",startIcon:e.createElement(B,null),onClick:R},"Clear")),l&&l.length?e.createElement(n,{sx:{flexGrow:1},marginTop:4},e.createElement(j,{results:l,resolutionStrategy:t.options.resolutionStrategy})):null))}export{q as PolicyTester};
|
|
2
|
+
//# sourceMappingURL=PolicyTester.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as r,Typography as i}from"@material-ui/core";import t from"react";const s=r(e=>({fieldset:{border:"none",margin:`${e.spacing(3)}px 0 ${e.spacing(3)}px`,paddingLeft:"0"}})),a=({children:e,title:n})=>{const o=s();return t.createElement("fieldset",{className:o.fieldset},t.createElement(i,{variant:"h6",component:"legend"},n),e)};export{a as PolicyTesterFieldset};
|
|
2
|
+
//# sourceMappingURL=PolicyTesterFieldset.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as c,FormControl as o,InputLabel as p,Select as u,Input as d,Chip as y,MenuItem as E,Checkbox as f,ListItemText as b,FormHelperText as g}from"@material-ui/core";import e from"react";import{usePermissions as h}from"../Permissions/PermissionsMetadataContext.esm.js";const S=c(a=>({chipContainer:{marginTop:a.spacing(1),marginLeft:a.spacing(1),display:"flex",flexWrap:"wrap"}})),v=e.forwardRef(({selectedPermissionNames:a,setSelectedPermissionNames:m,errorMessage:l},i)=>{const s=S(),{permissions:n}=h();return e.createElement(e.Fragment,null,e.createElement(o,{fullWidth:!0,error:!!l},e.createElement(p,{id:"selectLabel"},"Select permissions"),e.createElement(u,{"data-testid":"policyTesterPermissionsSelect",ref:i,native:!1,displayEmpty:!0,multiple:!0,value:a,onChange:t=>m(t.target.value),input:e.createElement(d,null),"aria-labelledby":"selectLabel",renderValue:t=>e.createElement("div",{className:s.chipContainer,"aria-labelledby":"selectLabel"},n?.filter(r=>t.includes(r.name)).map(r=>e.createElement(y,{key:r.name,label:r.name})))},n?.map(t=>e.createElement(E,{key:t.name,value:t.name},e.createElement(f,{color:"primary",checked:a.includes(t.name),name:t.name,value:t.name,required:!0}),e.createElement(b,{primary:t.name})))),e.createElement(g,null,l)))});export{v as PolicyTesterPermissionSelect};
|
|
2
|
+
//# sourceMappingURL=PolicyTesterPermissionSelect.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as i,Accordion as s,AccordionSummary as l,Grid as o,Typography as n,AccordionDetails as a}from"@material-ui/core";import c from"@material-ui/icons/ExpandMore";import e from"react";import{PermissionName as m}from"../Permission/PermissionName.esm.js";import{DecisionIcon as d}from"./DecisionIcon.esm.js";import{PolicyTestResultDetails as p}from"./PolicyTestResultDetails.esm.js";import{StatusChip as u}from"./StatusChip.esm.js";function h({decision:t}){let r;switch(t.result){case"ALLOW":r={severity:"success",text:"Allow"};break;case"DENY":r={severity:"error",text:"Deny"};break;default:r={severity:"info",text:"Conditional"};break}return e.createElement(u,{text:r.text,severity:r.severity,icon:e.createElement(d,{authorizeResult:t.result}),title:`${r.text} decision chip`,size:"large"})}const E=i(t=>({permissionName:{display:"flex",alignItems:"center",height:"100%",fontWeight:"bold"},detailsContainer:{padding:`${t.spacing(2)}px ${t.spacing(1)}px 0`,borderTop:`1px solid ${t.palette.divider}`}})),x=({resultRow:t})=>{const r=E();return e.createElement(s,null,e.createElement(l,{expandIcon:e.createElement(c,null),"aria-controls":"result{$resultIndex}-content",id:t.permission.name},e.createElement(o,{container:!0},e.createElement(o,{item:!0,xs:12,md:4},e.createElement(n,{variant:"body1",className:r.permissionName,component:"h5"},e.createElement(m,{name:t.permission.name}))),e.createElement(o,{item:!0,xs:12,md:8},e.createElement(n,{variant:"body2"},t.roles.length>0?"For a user who has all the selected roles, the result will be:":"For a user with no assigned roles, the result will be:"),e.createElement(h,{decision:t.decision})))),e.createElement(a,null,e.createElement("div",{className:r.detailsContainer},e.createElement(p,{resultRow:t}))))};export{x as PolicyTesterResultRow};
|
|
2
|
+
//# sourceMappingURL=PolicyTesterResultRow.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as l,Typography as a,Grid as n}from"@material-ui/core";import{Alert as o}from"@material-ui/lab";import t from"react";import{PolicyTesterResultRow as c}from"./PolicyTesterResultRow.esm.js";const m=l(e=>({header:{borderTop:`1px solid ${e.palette.divider}`,padding:`${e.spacing(3)}px ${e.spacing(1)}px`,borderBottom:`1px solid ${e.palette.divider}`},resultHeading:{marginBottom:e.spacing(1)},accordionHeader:{padding:`${e.spacing(1)}px ${e.spacing(6)}px ${e.spacing(1)}px ${e.spacing(0)}px`,margin:"0"}})),p=({results:e,resolutionStrategy:i})=>{const r=m();return e.length?t.createElement(t.Fragment,null,t.createElement("div",{className:r.header},t.createElement(a,{variant:"h5",component:"h4",color:"textPrimary",className:r.resultHeading},"Test results"),t.createElement(o,{severity:"info"},"All the tests are evaluated using"," ",t.createElement("strong",null,i),", which is the policy resolution strategy")),t.createElement(n,{container:!0,className:r.accordionHeader},t.createElement(n,{item:!0,xs:12,md:4},t.createElement(a,{variant:"body1",color:"textSecondary"},"Permission")),t.createElement(n,{item:!0,xs:12,md:8},t.createElement(a,{variant:"body1",color:"textSecondary"},"Result"))),e.map(s=>t.createElement(c,{resultRow:s,key:s.permission.name}))):null};export{p as PolicyTesterResults};
|
|
2
|
+
//# sourceMappingURL=PolicyTesterResults.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as i,FormControl as m,InputLabel as o,Select as s,Input as p,Chip as d,MenuItem as u,Checkbox as y,ListItemText as E}from"@material-ui/core";import e from"react";import{usePolicyContext as b}from"../Policy/PolicyProvider.esm.js";const f=i(l=>({chipContainer:{marginTop:l.spacing(1),marginLeft:l.spacing(1),display:"flex",flexWrap:"wrap"}})),g=({selectedRoleIds:l,setSelectedRoleIds:n})=>{const c=f(),{policy:r}=b();return e.createElement(e.Fragment,null,e.createElement(m,{fullWidth:!0},e.createElement(o,{id:"selectLabel"},"Select roles"),e.createElement(s,{"data-testid":"policyTesterRolesSelect",native:!1,displayEmpty:!0,multiple:!0,value:l,onChange:t=>n(t.target.value),input:e.createElement(p,null),"aria-labelledby":"selectLabel",renderValue:t=>e.createElement("div",{className:c.chipContainer,"aria-labelledby":"selectLabel"},r.roles.filter(a=>t.includes(a.id)).map(a=>e.createElement(d,{key:a.name,label:a.name})))},r.roles.map(t=>e.createElement(u,{key:t.id,value:t.id},e.createElement(y,{color:"primary",checked:l.includes(t.id),name:t.name,value:t.id}),e.createElement(E,{primary:t.name}))))))};export{g as PolicyTesterRoleSelect};
|
|
2
|
+
//# sourceMappingURL=PolicyTesterRoleSelect.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as n}from"@material-ui/core";import{Alert as a}from"@material-ui/lab";import o from"react";function r(t,e){switch(e){case"small":return t.typography.caption;case"medium":return t.typography.body1;case"large":return t.typography.subtitle1;default:return t.typography.caption}}function i(t){switch(t){case"small":return .2;case"medium":return .3;case"large":return 1;default:return .8}}const s=n(t=>({root:{display:"inline-flex",fontWeight:"bold",borderRadius:"1000px",margin:t.spacing(1),padding:t.spacing(0,1)},message:({size:e})=>({fontSize:r(t,e).fontSize,font:r(t,e).font,verticalAlign:"middle",padding:t.spacing(i(e),0,i(e),0)})}),{name:"MuiAlert"});function l(t){const e=s({size:t.size||"small"});return o.createElement(a,{classes:{root:e.root,message:e.message},role:"textbox",severity:t.severity,icon:t.icon??!1,variant:t.outlined?"outlined":"standard",title:t.text},t.text)}export{l as StatusChip};
|
|
2
|
+
//# sourceMappingURL=StatusChip.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useApi as f}from"@backstage/core-plugin-api";import{useState as y,useCallback as m}from"react";import{rbacApiRef as d}from"../../api.esm.js";import{usePermissions as P}from"../Permissions/PermissionsMetadataContext.esm.js";import{usePolicyContext as C}from"../Policy/PolicyProvider.esm.js";const b=()=>{const{policy:e}=C(),{permissions:s}=P(),r=f(d),[l,o]=y([]),c=m(async(t,p)=>{if(!s)return;const u=(await r.testPolicyDecisions(s.filter(i=>p.includes(i.name)).map(i=>({policyConfig:e,roleIds:t,permission:i})))).map(i=>({...i,roles:e.roles.filter(a=>t.includes(a.id))}));o(u)},[e,s,r,o]),n=m(()=>{o([])},[o]);return[l,c,n]};export{b as usePolicyTestResult};
|
|
2
|
+
//# sourceMappingURL=usePolicyTestResult.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useMemo as p,useEffect as u}from"react";import m from"react-use/lib/useLocalStorage";import{z as l}from"zod";const g=l.array(l.string()),S=(a,i,c)=>{const[n,t]=m(`@spotify/backstage-plugin-rbac:policyTesterForm:${a}`,[],{raw:!1,serializer:e=>JSON.stringify(e),deserializer:e=>{let s;try{s=JSON.parse(e)}catch(f){return console.error("Failed to parse json",f),[]}const r=g.safeParse(s);return r.success?r.data:(console.error(`Stored value for ${a} has the wrong shape`,r.error),[])}}),o=p(()=>n??[],[n]);return u(()=>{const e=new Set(i),s=o.some(r=>!e.has(r));!c&&s&&t(o.filter(r=>e.has(r)))},[i,o,t,c]),[o,t]};export{S as usePolicyTesterLocalStorageStrings};
|
|
2
|
+
//# sourceMappingURL=usePolicyTesterLocalStorageStrings.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{SidebarItem as o}from"@backstage/core-components";import m from"@material-ui/icons/Lock";import t from"react";import{Authorized as i}from"./Auth/Authorized.esm.js";function n({text:e="RBAC",...r}){return t.createElement(i,null,t.createElement(o,{icon:m,to:"rbac",text:e,...r}))}export{n as RBACSidebarItem};
|
|
2
|
+
//# sourceMappingURL=RBACSidebarItem.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as p,Tooltip as l,Typography as s}from"@material-ui/core";import{useAutoUpdatingRelativeTime as c}from"@spotify/backstage-plugin-core";import{DateTime as r}from"luxon";import e from"react";const T=p(()=>({root:{display:"inline-flex"}})),f=({timestamp:t,description:i})=>{const n=T(),m=r.fromISO(t).toLocaleString(r.DATETIME_FULL),o=c(t),a=i?`${i}${o}`:o;return e.createElement("span",{className:n.root},e.createElement(l,{title:m},e.createElement(s,{component:"span",display:"inline",variant:"inherit"},a)))};export{f as RelativeTime};
|
|
2
|
+
//# sourceMappingURL=RelativeTime.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Box as m,IconButton as t}from"@material-ui/core";import s from"@material-ui/icons/KeyboardArrowDown";import c from"@material-ui/icons/KeyboardArrowUp";import e from"react";import{shiftPositionInArray as a}from"./shiftPositionInArray.esm.js";const d=({array:l,index:o,onReorder:r})=>{const n=o===0,i=o===l.length-1;return e.createElement(m,{display:"flex"},e.createElement(t,{disabled:n,onClick:()=>r(a(l,o,-1)),"aria-label":"Move up",size:"small"},e.createElement(c,null)),e.createElement(t,{disabled:i,onClick:()=>r(a(l,o,1)),"aria-label":"Move down",size:"small"},e.createElement(s,null)))};export{d as ReorderControls};
|
|
2
|
+
//# sourceMappingURL=ReorderControls.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Box as t,Typography as o,Tooltip as a}from"@material-ui/core";import m from"@material-ui/icons/Info";import e from"react";const l=({helpText:r})=>e.createElement(t,{display:"flex",alignItems:"center"},e.createElement(t,{component:"span",mr:1},e.createElement(o,{variant:"body2",noWrap:!0},"Reorder")),e.createElement(a,{title:r},e.createElement(m,{color:"primary","aria-label":r})));export{l as ReorderInfo};
|
|
2
|
+
//# sourceMappingURL=ReorderInfo.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ContentHeader as M}from"@backstage/core-components";import{useApp as F}from"@backstage/core-plugin-api";import{makeStyles as $,Button as z,Grid as g,Card as y}from"@material-ui/core";import{invariant as P}from"@spotify/backstage-plugin-core";import{RoleParser as G}from"@spotify/backstage-plugin-rbac-common";import o,{useState as C}from"react";import{useParams as H,useNavigate as K}from"react-router-dom";import{getZodValidationToKeyMap as L}from"../../utils/getZodValidationToKeyMap.esm.js";import{DecisionDialog as O}from"../DecisionDialog/DecisionDialog.esm.js";import{DiffBadge as U}from"../Diffing/DiffBadge.esm.js";import V from"../EditableInput/EditableInput.esm.js";import{PageWrapper as W}from"../Layout/PageWrapper.esm.js";import{Title as Z}from"../Layout/Title.esm.js";import{MembersTable as j}from"../Members/MembersTable.esm.js";import q from"../Permissions/PermissionsTable.esm.js";import{PolicyProvider as J,usePolicyContext as Q}from"../Policy/PolicyProvider.esm.js";function X({roleId:m}){const{versionId:s,roleId:d}=H(),n=m??d;return P(n),P(s),o.createElement(J,{policyId:s},o.createElement(v,{roleId:n}))}const Y=$(m=>({cardContainer:{margin:m.spacing(0)}}));function v({roleId:m}){const{diff:s,updateLocalDraft:d,policy:n}=Q(),e=n.roles.find(r=>r.id===m),f=s?.roles[m],[a,E]=C(null),[b,c]=C(!1),x=F(),{NotFoundErrorPage:I}=x.getComponents(),T=K(),h=Y();if(!e)return o.createElement(I,null);const u=e.name,i=r=>{const t=n.roles.findIndex(B=>B.id===r.id),l=[...n.roles];l.splice(t,1,r),d({...n,roles:l})},k=r=>{i({...e,name:r})},R=r=>{if(a===null)i({...e,permissions:[r,...e.permissions]});else{const t=[...e.permissions];t.splice(a,1,r),i({...e,permissions:t})}c(!1)},w=r=>{if(r==="*")i({...e,members:e.members==="*"?[]:"*"});else if(e.members==="*")i({...e,members:[r]});else{const t=e.members.includes(r)?e.members.filter(l=>l!==r):[...e.members,r];i({...e,members:t.length===0?"*":t})}},A=r=>{i({...e,permissions:e.permissions.filter((t,l)=>r!==l)})},D=r=>{i({...e,permissions:r})},N=L(G.safeParse(e)).name,p=n.status!=="draft",S=n.options.resolutionStrategy==="any-allow";return o.createElement(o.Fragment,null,o.createElement(W,{pages:[{title:n.name,path:`../../../${n.id}`},{title:u}],header:o.createElement(M,{titleComponent:o.createElement(Z,null,n.name," \xA0\u01C0",p?o.createElement(o.Fragment,null,"\xA0",u):o.createElement(V,{invalid:N,value:u,name:"Role name",onTextChange:k}),o.createElement(U,{operation:f?.role.operation,size:"medium"})),description:n.description||void 0},o.createElement(z,{variant:"outlined",color:"primary",onClick:()=>T("../..",{relative:"path"})},"Back to policy"))},o.createElement(g,{container:!0,className:h.cardContainer,spacing:4,direction:"row"},o.createElement(g,{item:!0,xs:6},o.createElement(y,null,o.createElement(j,{diff:f||null,role:e,policyId:n.id,onToggleMember:w,readonly:p}))),o.createElement(g,{item:!0,xs:6},o.createElement(y,null,o.createElement(q,{diff:f||null,permissions:e.permissions,onNewPermissionClick:()=>{E(null),c(!0)},onOpenPermission:r=>{E(r),c(!0)},onReorderPermissions:D,onRemovePermissionClick:A,anyAllow:S,readonly:p}))))),b&&o.createElement(O,{rolePermission:a!==null?e.permissions[a]:void 0,onClose:()=>c(!1),onSave:R,readonly:p}))}export{X as RolePage,v as RolePageContent};
|
|
2
|
+
//# sourceMappingURL=RolePage.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Link as h}from"@backstage/core-components";import{Paper as b,Box as c,Typography as C,Button as w,Table as T,TableHead as R,TableRow as u,TableCell as l,TableBody as v,IconButton as x}from"@material-ui/core";import A from"@material-ui/icons/Add";import B from"@material-ui/icons/Delete";import e from"react";import{useNavigate as I}from"react-router-dom";import{ConfirmationDialog as D}from"../ConfirmationDialog/ConfirmationDialog.esm.js";import{DiffBadge as N}from"../Diffing/DiffBadge.esm.js";import{usePolicyContext as k}from"../Policy/PolicyProvider.esm.js";import{ReorderControls as G}from"../ReorderControls/ReorderControls.esm.js";import{ReorderInfo as $}from"../ReorderControls/ReorderInfo.esm.js";const L="Use the arrows to change the order in which roles are evaluated.";function P({}){const{diff:m,policy:t,createNewRole:o,updateLocalDraft:i}=k(),p=I(),d=U(t),a=t.status!=="draft",s=t.options.resolutionStrategy==="any-allow",f=r=>{i({...t,roles:r})},E=r=>{i({...t,roles:t.roles.filter(({id:n})=>n!==r)})},y=()=>{p(`./roles/${o()}`)};return e.createElement(b,null,e.createElement(c,{display:"flex",justifyContent:"space-between",padding:2},e.createElement(C,{variant:"h3"},"Roles"),!a&&e.createElement(w,{color:"primary",variant:"outlined",startIcon:e.createElement(A,null),onClick:()=>y()},"New role")),e.createElement(T,{"data-testid":"rolesTable"},e.createElement(R,null,e.createElement(u,null,!a&&!s&&e.createElement(l,{style:{width:0}},e.createElement($,{helpText:L})),e.createElement(l,null,"Name"),e.createElement(l,null,"Users"),e.createElement(l,null,"Groups"),!a&&e.createElement(l,{style:{width:0}}))),e.createElement(v,null,d.map((r,n)=>e.createElement(u,{key:n},!a&&!s&&e.createElement(l,null,e.createElement(G,{array:t.roles,index:n,onReorder:f})),e.createElement(l,null,e.createElement(c,{alignItems:"center",display:"flex",gridGap:8},e.createElement(h,{to:`roles/${r.id}`},r.name),e.createElement(N,{operation:m?.roles[r.id].role.operation}))),e.createElement(l,null,r.userCount),e.createElement(l,null,r.groupCount),!a&&e.createElement(l,{align:"right"},e.createElement(D,{message:"Are you sure you want to remove this role?",title:"Remove role?",onConfirm:()=>E(r.id)},g=>e.createElement(x,{...g,"aria-label":"Remove role",size:"small"},e.createElement(B,null)))))))))}function U(m){return m.roles.map(t=>({id:t.id,name:t.name,userCount:Array.isArray(t.members)?t.members.filter(o=>o.startsWith("user:")).length:t.members,groupCount:Array.isArray(t.members)?t.members.filter(o=>o.startsWith("group:")).length:t.members}))}export{P as RolesTable};
|
|
2
|
+
//# sourceMappingURL=RolesTable.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Progress as n}from"@backstage/core-components";import{useApp as m}from"@backstage/core-plugin-api";import e from"react";import{Routes as l,Route as t}from"react-router-dom";import{Authorized as i}from"./Auth/Authorized.esm.js";import{HomePage as a}from"./Home/HomePage.esm.js";import{MemberOptionsProvider as p}from"./Members/MemberOptionsProvider.esm.js";import{PermissionMetadataProvider as s}from"./Permissions/PermissionsMetadataContext.esm.js";import{PoliciesProvider as c}from"./Policies/PoliciesProvider.esm.js";import{PolicyOptionsPage as u}from"./Policy/PolicyOptionsPage.esm.js";import{PolicyPage as E}from"./Policy/PolicyPage.esm.js";import{RolePage as f}from"./Role/RolePage.esm.js";function P(){const r=m(),{NotFoundErrorPage:o}=r.getComponents();return e.createElement(i,{loading:e.createElement(n,null),unauthorized:e.createElement(o,null)},e.createElement(c,null,e.createElement(s,null,e.createElement(p,null,e.createElement(l,null,e.createElement(t,{element:e.createElement(a,null),path:"/"}),e.createElement(t,{element:e.createElement(E,null),path:"/versions/:versionId"}),e.createElement(t,{element:e.createElement(u,null),path:"/versions/:versionId/options"}),e.createElement(t,{element:e.createElement(f,null),path:"/versions/:versionId/roles/:roleId"}))))))}export{P as RBACRoot};
|
|
2
|
+
//# sourceMappingURL=Root.esm.js.map
|
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{RBACRoot as e,RBACSidebarItem as t,rbacPlugin as R}from"./plugin.esm.js";export{e as RBACRoot,t as RBACSidebarItem,R as rbacPlugin};
|
|
2
2
|
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createPlugin as r,createApiFactory as i,fetchApiRef as n,discoveryApiRef as p,createRoutableExtension as a,createComponentExtension as m}from"@backstage/core-plugin-api";import{rbacApiRef as c,RBACApi as R}from"./api.esm.js";import{rootRouteRef as t}from"./routes.esm.js";const o=r({id:"rbac",routes:{root:t},apis:[i({api:c,deps:{fetchApi:n,discoveryApi:p},factory(e){return new R(e)}})]}),A=o.provide(a({name:"RBACRoot",component:()=>import("./components/Root.esm.js").then(e=>e.RBACRoot),mountPoint:t})),f=o.provide(m({name:"RBACSidebarItem",component:{lazy:()=>import("./components/RBACSidebarItem.esm.js").then(e=>e.RBACSidebarItem)}}));export{A as RBACRoot,f as RBACSidebarItem,o as rbacPlugin};
|
|
2
|
+
//# sourceMappingURL=plugin.esm.js.map
|
package/package.json
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spotify/backstage-plugin-rbac",
|
|
3
3
|
"description": "Control access to actions and data in Backstage with ease.",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.3",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"homepage": "https://backstage.spotify.com",
|
|
7
7
|
"main": "./dist/index.esm.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"publishConfig": {},
|
|
10
10
|
"backstage": {
|
|
11
|
-
"role": "frontend-plugin"
|
|
11
|
+
"role": "frontend-plugin",
|
|
12
|
+
"pluginId": "rbac",
|
|
13
|
+
"pluginPackages": [
|
|
14
|
+
"@spotify/backstage-plugin-rbac",
|
|
15
|
+
"@spotify/backstage-plugin-rbac-backend",
|
|
16
|
+
"@spotify/backstage-plugin-rbac-common",
|
|
17
|
+
"@spotify/backstage-plugin-rbac-node"
|
|
18
|
+
]
|
|
12
19
|
},
|
|
13
20
|
"sideEffects": false,
|
|
14
21
|
"exports": {
|
|
@@ -31,25 +38,26 @@
|
|
|
31
38
|
"test": "backstage-cli package test",
|
|
32
39
|
"clean": "backstage-cli package clean",
|
|
33
40
|
"prepack": "backstage-cli package prepack",
|
|
34
|
-
"postpack": "backstage-cli package postpack"
|
|
41
|
+
"postpack": "backstage-cli package postpack",
|
|
42
|
+
"a11y": "yarn dlx @lhci/cli@0.13.x --config ./.lighthouserc.js autorun"
|
|
35
43
|
},
|
|
36
44
|
"dependencies": {
|
|
37
|
-
"@backstage/catalog-model": "^1.
|
|
38
|
-
"@backstage/core-compat-api": "^0.2.
|
|
39
|
-
"@backstage/core-components": "^0.14.
|
|
40
|
-
"@backstage/core-plugin-api": "^1.9.
|
|
45
|
+
"@backstage/catalog-model": "^1.5.0",
|
|
46
|
+
"@backstage/core-compat-api": "^0.2.6",
|
|
47
|
+
"@backstage/core-components": "^0.14.8",
|
|
48
|
+
"@backstage/core-plugin-api": "^1.9.3",
|
|
41
49
|
"@backstage/errors": "^1.2.4",
|
|
42
|
-
"@backstage/frontend-plugin-api": "^0.6.
|
|
43
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
44
|
-
"@backstage/plugin-permission-common": "^0.7.
|
|
45
|
-
"@backstage/plugin-permission-react": "^0.4.
|
|
46
|
-
"@backstage/theme": "^0.5.
|
|
50
|
+
"@backstage/frontend-plugin-api": "^0.6.6",
|
|
51
|
+
"@backstage/plugin-catalog-react": "^1.12.1",
|
|
52
|
+
"@backstage/plugin-permission-common": "^0.7.14",
|
|
53
|
+
"@backstage/plugin-permission-react": "^0.4.23",
|
|
54
|
+
"@backstage/theme": "^0.5.6",
|
|
47
55
|
"@backstage/types": "^1.1.1",
|
|
48
56
|
"@material-ui/core": "^4.12.2",
|
|
49
57
|
"@material-ui/icons": "^4.9.1",
|
|
50
58
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
51
|
-
"@spotify/backstage-plugin-core": "^0.7.
|
|
52
|
-
"@spotify/backstage-plugin-rbac-common": "^0.5.
|
|
59
|
+
"@spotify/backstage-plugin-core": "^0.7.2",
|
|
60
|
+
"@spotify/backstage-plugin-rbac-common": "^0.5.14",
|
|
53
61
|
"ajv": "^8.11.2",
|
|
54
62
|
"file-saver": "^2.0.5",
|
|
55
63
|
"js-yaml": "^4.1.0",
|
|
@@ -58,25 +66,25 @@
|
|
|
58
66
|
"luxon": "^3.1.1",
|
|
59
67
|
"react-use": "^17.2.4",
|
|
60
68
|
"react-virtualized": "^9.22.5",
|
|
61
|
-
"uuid": "^
|
|
69
|
+
"uuid": "^10.0.0",
|
|
62
70
|
"zod": "^3.20.0",
|
|
63
71
|
"zod-to-json-schema": "^3.20.2"
|
|
64
72
|
},
|
|
65
73
|
"peerDependencies": {
|
|
66
|
-
"@backstage/plugin-permission-node": "^0.7.
|
|
74
|
+
"@backstage/plugin-permission-node": "^0.7.31",
|
|
67
75
|
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
68
76
|
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
69
77
|
},
|
|
70
78
|
"devDependencies": {
|
|
71
|
-
"@backstage/cli": "^0.26.
|
|
72
|
-
"@backstage/core-app-api": "^1.12.
|
|
73
|
-
"@backstage/dev-utils": "^1.0.
|
|
79
|
+
"@backstage/cli": "^0.26.9",
|
|
80
|
+
"@backstage/core-app-api": "^1.12.6",
|
|
81
|
+
"@backstage/dev-utils": "^1.0.33",
|
|
74
82
|
"@backstage/e2e-test-utils": "^0.1.1",
|
|
75
|
-
"@backstage/frontend-test-utils": "^0.1.
|
|
76
|
-
"@backstage/plugin-permission-node": "^0.7.
|
|
77
|
-
"@backstage/test-utils": "^1.5.
|
|
83
|
+
"@backstage/frontend-test-utils": "^0.1.8",
|
|
84
|
+
"@backstage/plugin-permission-node": "^0.7.31",
|
|
85
|
+
"@backstage/test-utils": "^1.5.6",
|
|
78
86
|
"@playwright/test": "^1.32.3",
|
|
79
|
-
"@sp4b-dev/test-utils": "^0.0.
|
|
87
|
+
"@sp4b-dev/test-utils": "^0.0.4",
|
|
80
88
|
"@testing-library/jest-dom": "^6.0.0",
|
|
81
89
|
"@testing-library/react": "^14.0.0",
|
|
82
90
|
"@testing-library/user-event": "^14.0.0",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{useApi as i}from"@backstage/core-plugin-api";import e from"react";import u from"react-use/lib/useAsync";import{a as m}from"./routes-DldYB8_w.esm.js";function p({children:n,loading:l=null,unauthorized:o=null}){var r;const a=i(m),t=u(()=>a.authorize(),[]);return t.loading?e.createElement(e.Fragment,null,l):(r=t.value)!=null&&r.authorized?e.createElement(e.Fragment,null,n):e.createElement(e.Fragment,null,o)}export{p as A};
|
|
2
|
-
//# sourceMappingURL=Authorized-BwbJLswg.esm.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{SidebarItem as e}from"@backstage/core-components";import m from"@material-ui/icons/Lock";import t from"react";import{A as i}from"./Authorized-BwbJLswg.esm.js";import"@backstage/core-plugin-api";import"react-use/lib/useAsync";import"./routes-DldYB8_w.esm.js";import"@backstage/errors";import"@spotify/backstage-plugin-rbac-common";function p({text:r="RBAC",...o}){return t.createElement(i,null,t.createElement(e,{icon:m,to:"rbac",text:r,...o}))}export{p as RBACSidebarItem};
|
|
2
|
-
//# sourceMappingURL=RBACSidebarItem-DRxQHRoM.esm.js.map
|