@spotify/backstage-plugin-rbac 0.7.9 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/alpha/apis.esm.js +1 -1
- package/dist/alpha/pages.esm.js +1 -1
- package/dist/alpha/plugin.esm.js +1 -1
- package/dist/alpha.d.ts +8 -9
- package/dist/components/Home/HomePage.esm.js +1 -1
- package/dist/components/Layout/Header.esm.js +2 -0
- package/dist/components/Layout/PageWrapper.esm.js +1 -1
- package/dist/components/Policy/PolicyOptionsPage.esm.js +1 -1
- package/dist/components/Policy/PolicyPage.esm.js +1 -1
- package/dist/components/RBACSidebarItem.esm.js +1 -1
- package/dist/components/Role/RolePage.esm.js +1 -1
- package/package.json +19 -17
- package/dist/components/Layout/Breadcrumbs.esm.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @spotify/backstage-plugin-rbac
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- This plugin now uses a more compact header style. Note: the [@backstage/ui](https://ui.backstage.io/install) package must be installed and available in your Backstage instance.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependency `backstage` to `1.44.1`.
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @spotify/backstage-plugin-core@0.8.11
|
|
14
|
+
- @spotify/backstage-plugin-rbac-common@0.6.10
|
|
15
|
+
|
|
16
|
+
## 0.7.10
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependency `backstage` to `1.42.0`.
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
- Updated dependencies
|
|
23
|
+
- @spotify/backstage-plugin-core@0.8.10
|
|
24
|
+
- @spotify/backstage-plugin-rbac-common@0.6.9
|
|
25
|
+
|
|
3
26
|
## 0.7.9
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/dist/alpha/apis.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ApiBlueprint as
|
|
1
|
+
import{ApiBlueprint as e,fetchApiRef as r,discoveryApiRef as o}from"@backstage/frontend-plugin-api";import{rbacApiRef as A,RBACApi as c}from"../api.esm.js";const f=e.make({params:p=>p({api:A,deps:{fetchApi:r,discoveryApi:o},factory:i=>new c(i)})});export{f as rbacApi};
|
|
2
2
|
//# sourceMappingURL=apis.esm.js.map
|
package/dist/alpha/pages.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as r}from"react/jsx-runtime";import{convertLegacyRouteRef as t,compatWrapper as e}from"@backstage/core-compat-api";import{PageBlueprint as a}from"@backstage/frontend-plugin-api";import{rootRouteRef as m}from"../routes.esm.js";const p=a.make({params:{routeRef:t(m),
|
|
1
|
+
import{jsx as r}from"react/jsx-runtime";import{convertLegacyRouteRef as t,compatWrapper as e}from"@backstage/core-compat-api";import{PageBlueprint as a}from"@backstage/frontend-plugin-api";import{rootRouteRef as m}from"../routes.esm.js";const p=a.make({params:{routeRef:t(m),path:"/rbac",loader:()=>import("../components/Root.esm.js").then(o=>e(r(o.RBACRoot,{})))}});export{p as rbacPage};
|
|
2
2
|
//# sourceMappingURL=pages.esm.js.map
|
package/dist/alpha/plugin.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createFrontendPlugin as r}from"@backstage/frontend-plugin-api";import{rbacApi as o}from"./apis.esm.js";import{rbacPage as a}from"./pages.esm.js";var e=r({
|
|
1
|
+
import{createFrontendPlugin as r}from"@backstage/frontend-plugin-api";import{rbacApi as o}from"./apis.esm.js";import{rbacPage as a}from"./pages.esm.js";var e=r({pluginId:"rbac",extensions:[a,o]});export{e as default};
|
|
2
2
|
//# sourceMappingURL=plugin.esm.js.map
|
package/dist/alpha.d.ts
CHANGED
|
@@ -5,19 +5,17 @@ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
|
5
5
|
/**
|
|
6
6
|
* @public
|
|
7
7
|
*/
|
|
8
|
-
declare const _default: _backstage_frontend_plugin_api.
|
|
9
|
-
|
|
8
|
+
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{}, {}, {
|
|
9
|
+
"api:rbac": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
10
10
|
kind: "api";
|
|
11
11
|
name: undefined;
|
|
12
12
|
config: {};
|
|
13
13
|
configInput: {};
|
|
14
|
-
output: _backstage_frontend_plugin_api.
|
|
14
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_core_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
15
15
|
inputs: {};
|
|
16
|
-
params: {
|
|
17
|
-
factory: _backstage_core_plugin_api.AnyApiFactory;
|
|
18
|
-
};
|
|
16
|
+
params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_core_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_core_plugin_api.AnyApiFactory>;
|
|
19
17
|
}>;
|
|
20
|
-
|
|
18
|
+
"page:rbac": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
21
19
|
kind: "page";
|
|
22
20
|
name: undefined;
|
|
23
21
|
config: {
|
|
@@ -26,12 +24,13 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
|
|
|
26
24
|
configInput: {
|
|
27
25
|
path?: string | undefined;
|
|
28
26
|
};
|
|
29
|
-
output: _backstage_frontend_plugin_api.
|
|
27
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
30
28
|
optional: true;
|
|
31
29
|
}>;
|
|
32
30
|
inputs: {};
|
|
33
31
|
params: {
|
|
34
|
-
defaultPath:
|
|
32
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
33
|
+
path: string;
|
|
35
34
|
loader: () => Promise<JSX.Element>;
|
|
36
35
|
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
37
36
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as o}from"react/jsx-runtime";import{Progress as
|
|
1
|
+
import{jsx as o}from"react/jsx-runtime";import{Progress as c,ErrorPanel as s}from"@backstage/core-components";import{Grid as n}from"@material-ui/core";import f from"react-use/lib/useMount";import{PageWrapper as a}from"../Layout/PageWrapper.esm.js";import{usePoliciesContext as P}from"../Policies/PoliciesProvider.esm.js";import{useFetchPolicies as g}from"../Policies/useFetchPolicies.esm.js";import{PolicyImportButton as h}from"../Policy/PolicyImportButton.esm.js";import m from"./HomePageContent.esm.js";import d from"./HomePageEmptyState.esm.js";function u(){const{fallbackPolicy:e,policies:r}=P(),{loading:p,error:t,fetchPolicies:l}=g();f(()=>{r||l()});let i;return p?i=o(n,{item:!0,xs:12,children:o(c,{})}):t?i=o(s,{error:t}):e&&(!r||r.length===0)?i=o(m,{policies:[e]}):!r||r.length===0?i=o(d,{}):i=o(m,{policies:r}),o(a,{pages:void 0,pageTitle:"Policies",primaryAction:o(h,{}),children:i})}export{u as HomePage};
|
|
2
2
|
//# sourceMappingURL=HomePage.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsxs as o,Fragment as a,jsx as e}from"react/jsx-runtime";import{useApi as m,configApiRef as p}from"@backstage/core-plugin-api";import{Header as n}from"@backstage/ui";import{Helmet as s}from"react-helmet";const f=t=>{const r=m(p).getOptionalString("app.title")||"Backstage",i=`${t.title} | ${r}`;return o(a,{children:[e(s,{defaultTitle:i}),e(n,{...t})]})};export{f as Header};
|
|
2
|
+
//# sourceMappingURL=Header.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as c,Fragment as l,jsx as e}from"react/jsx-runtime";import{useRouteRef as m}from"@backstage/core-plugin-api";import{HeaderPage as s,Grid as o}from"@backstage/ui";import p from"@material-ui/icons/Lock";import{SpotifyLicenseBanner as u}from"@spotify/backstage-plugin-core";import{rootRouteRef as d}from"../../routes.esm.js";import{Header as f}from"./Header.esm.js";function g({children:r,pageTitle:i,primaryAction:t,pages:n}){const a=m(d)();return c(l,{children:[e(u,{backend:"rbac",invalidLicenseMessage:"Your existing policy will continue to apply, but you will be unable to make any changes until you enter a valid license."}),e(f,{title:"Role Based Access Control",titleLink:a,icon:e(p,{})}),e(s,{title:i,customActions:t,breadcrumbs:n}),e(o.Root,{columns:"1",mx:"5",children:e(o.Item,{children:r})})]})}export{g as PageWrapper};
|
|
2
2
|
//# sourceMappingURL=PageWrapper.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as o,jsxs as a,Fragment as s}from"react/jsx-runtime";import{useRouteRef as y}from"@backstage/core-plugin-api";import{makeStyles as f,Button as g,Grid as u,Typography as i,Chip as v}from"@material-ui/core";import{invariant as x}from"@spotify/backstage-plugin-core";import{useParams as w,useNavigate as b}from"react-router-dom";import{rootRouteRef as P}from"../../routes.esm.js";import{PageWrapper as N}from"../Layout/PageWrapper.esm.js";import{PolicyOptionCard as c}from"./PolicyOptionCard.esm.js";import{PolicyProvider as S,usePolicyContext as W}from"./PolicyProvider.esm.js";const C=f(e=>({title:{display:"flex",alignItems:"center",paddingBottom:e.spacing(2)},maxWidthWrapper:{maxWidth:"800px"},readOnlyChip:{marginLeft:e.spacing(1)},paragraph:{paddingBottom:e.spacing(1)}}));function O(){const{versionId:e}=w();return x(e),o(S,{policyId:e,children:o(p,{})})}function p(){const e=C(),{policy:t,updateLocalDraft:d}=W(),h=b(),n=y(P)(),r=t.status!=="draft",l=m=>{d({...t,options:{...t.options,resolutionStrategy:m}})};return o(N,{pages:[{label:"Policies",href:n},{label:t.name,href:`${n}/versions/${t.id}`}],pageTitle:"Options",primaryAction:o(g,{variant:"outlined",color:"primary",onClick:()=>h("..",{relative:"path"}),children:"Back to policy"}),children:o(u,{item:!0,xs:12,className:e.maxWidthWrapper,children:a("div",{children:[a("div",{className:e.title,children:[o(i,{variant:"h5",component:"h1",children:"Decision resolution strategy"}),r?o(v,{label:"Read only",className:e.readOnlyChip}):null]}),o(i,{variant:"body2",component:"p",className:e.paragraph,children:"Multiple decisions from multiple roles could be applicable to a single user when authorizing a permission request. Please select the decision resolution strategy that makes sense for your policy."}),o(i,{variant:"body2",component:"p",className:e.paragraph,children:"Please note this strategy will be applied to the whole policy and greatly affects the outcome of permission decisions."}),o(c,{title:"Any-allow",changeResolutionStrategy:()=>l("any-allow"),readonly:r,defaultOption:!0,description:a(s,{children:[o(i,{variant:"body2",color:"textSecondary",component:"p",className:e.paragraph,children:"The first allow decision from all of the roles and decisions is the final result. A single explicit allow or an allow as a result of a conditional decision would result in a final allow decision, otherwise the decision is deny."}),o(i,{variant:"body2",color:"textSecondary",component:"p",className:e.paragraph,children:"With this option, the order of roles and decisions does not matter."})]}),active:t.options.resolutionStrategy==="any-allow"}),o(c,{title:"First match",changeResolutionStrategy:()=>l("first-match"),readonly:r,description:a(s,{children:[o(i,{variant:"body2",color:"textSecondary",component:"p",className:e.paragraph,children:"The first matching decision from the first matching role that is applicable to the user is the final result, regardless if that decision is an allow, deny or conditional."}),o(i,{variant:"body2",color:"textSecondary",component:"p",className:e.paragraph,children:"With this option, the order in which you define roles and decisions matters."})]}),active:t.options.resolutionStrategy==="first-match"})]})})})}export{O as PolicyOptionsPage,p as PolicyOptionsPageContent};
|
|
2
2
|
//# sourceMappingURL=PolicyOptionsPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as t,jsxs as r
|
|
1
|
+
import{jsx as t,jsxs as r}from"react/jsx-runtime";import{useApi as v,alertApiRef as x,useRouteRef as R}from"@backstage/core-plugin-api";import{EntityDisplayName as T}from"@backstage/plugin-catalog-react";import{Grid as m,Typography as u}from"@material-ui/core";import{invariant as b}from"@spotify/backstage-plugin-core";import{UpdateDraftRequestParser as C}from"@spotify/backstage-plugin-rbac-common";import{useState as A}from"react";import{useParams as D}from"react-router-dom";import{rootRouteRef as I}from"../../routes.esm.js";import{getZodValidationToKeyMap as L}from"../../utils/getZodValidationToKeyMap.esm.js";import j from"../EditableInput/EditableInput.esm.js";import{PageWrapper as M}from"../Layout/PageWrapper.esm.js";import{Title as N}from"../Layout/Title.esm.js";import{PolicyTester as S}from"../PolicyTester/PolicyTester.esm.js";import{RelativeTime as U}from"../RelativeTime/RelativeTime.esm.js";import{RolesTable as q}from"../Roles/RolesTable.esm.js";import E from"./EmptyRolesCard.esm.js";import{getActivityDetails as G}from"./getActivityDetails.esm.js";import{PolicyMenu as K}from"./PolicyMenu.esm.js";import{PolicyProvider as V,usePolicyContext as W}from"./PolicyProvider.esm.js";import{PolicyStatusChip as Z}from"./PolicyStatusChip.esm.js";function k(){const{versionId:e}=D();return b(e),t(V,{policyId:e,children:t(y,{})})}function y(){const{policy:e,updateLocalDraft:n}=W(),s=v(x),[p,l]=A(!1),h=R(I)(),P=i=>{let o;const a=C.safeParse({...e,name:i}),c=L(a).name;return c&&(o=a.error?.issues.find(f=>f.path.length===1&&f.path[0]==="name")?.message),l(c),{result:!c,helperText:o}},g=i=>{const{result:o,helperText:a}=P(i);o?n({...e,name:i}):s.post({display:"transient",severity:"error",message:a||"Please specify a valid policy name."})},d=e.status!=="draft";return t(M,{pages:[{label:"Policies",href:h}],pageTitle:e.name,primaryAction:t(K,{}),children:r(m,{container:!0,spacing:4,children:[r(m,{item:!0,xs:12,children:[r(N,{children:[d?e.name:t(j,{invalid:p,name:"Policy name",value:e.name,onTextChange:g}),t(Z,{status:e.status})]}),w(e)]}),t(m,{item:!0,xs:12,children:e.roles.length>0?t(q,{}):t(E,{readonly:d})}),t(m,{item:!0,xs:12,children:t(S,{})})]})})}function w(e){const n={created:"Created by ",published:"Last published by ",updated:"Last updated by "},{type:s,user:p,timestamp:l}=G(e);return r(u,{variant:"body2",children:[r(u,{component:"span",display:"inline",variant:"body2",children:[n[s],t(T,{hideIcon:!0,entityRef:p})," "]}),t(U,{timestamp:l})]})}export{k as PolicyPage,y as PolicyPageContent};
|
|
2
2
|
//# sourceMappingURL=PolicyPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as r}from"react/jsx-runtime";import{SidebarItem as e}from"@backstage/core-components";import i from"@material-ui/icons/Lock";import{Authorized as m}from"./Auth/Authorized.esm.js";function
|
|
1
|
+
import{jsx as r}from"react/jsx-runtime";import{SidebarItem as e}from"@backstage/core-components";import i from"@material-ui/icons/Lock";import{Authorized as m}from"./Auth/Authorized.esm.js";function c({text:t="RBAC",...o}){return r(m,{children:r(e,{icon:i,to:"rbac",text:t,...o})})}export{c as RBACSidebarItem};
|
|
2
2
|
//# sourceMappingURL=RBACSidebarItem.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as i,jsxs as
|
|
1
|
+
import{jsx as i,jsxs as m,Fragment as I}from"react/jsx-runtime";import{useApi as Z,alertApiRef as q,useAnalytics as J,useApp as Q,useRouteRef as U}from"@backstage/core-plugin-api";import{makeStyles as X,Button as Y,Grid as u,Card as ee,CardHeader as re,CardContent as ie,TextField as oe,Box as T}from"@material-ui/core";import{invariant as A}from"@spotify/backstage-plugin-core";import{RoleParser as se,RolesParser as ne}from"@spotify/backstage-plugin-rbac-common";import{useState as P}from"react";import{useParams as te,useNavigate as le}from"react-router-dom";import{useFeatureFlags as ae}from"../../hooks/useFeatureFlag.esm.js";import{rootRouteRef as me}from"../../routes.esm.js";import{getZodValidationToKeyMap as de}from"../../utils/getZodValidationToKeyMap.esm.js";import{DecisionDialog as ce}from"../DecisionDialog/DecisionDialog.esm.js";import{DiffBadge as pe}from"../Diffing/DiffBadge.esm.js";import ue from"../EditableInput/EditableInput.esm.js";import{PageWrapper as fe}from"../Layout/PageWrapper.esm.js";import{Title as ge}from"../Layout/Title.esm.js";import{MembersTable as he}from"../Members/MembersTable.esm.js";import ye from"../Permissions/PermissionsTable.esm.js";import{PolicyProvider as be,usePolicyContext as Pe}from"../Policy/PolicyProvider.esm.js";function ve({roleId:l}){const{versionId:d,roleId:f}=te(),o=l??f;return A(o),A(d),i(be,{policyId:d,children:i(F,{roleId:o})})}const Re=X(l=>({cardContainer:{margin:l.spacing(0)}}));function F({roleId:l}){const{diff:d,updateLocalDraft:f,policy:o}=Pe(),[k,w]=P(!1),D=Z(q),N=J(),S=ae(),r=o.roles.find(e=>e.id===l),g=d?.roles[l],[c,v]=P(null),[B,p]=P(!1),M=Q(),{NotFoundErrorPage:$}=M.getComponents(),j=le(),R=U(me)(),E=Re();if(!r)return i($,{});const h=r.name,t=e=>{const s=o.roles.findIndex(y=>y.id===e.id),n=[...o.roles];n.splice(s,1,e),f({...o,roles:n})},O=e=>{let s;const n=de(se.safeParse({...r,name:e})).name,y=o.roles.findIndex(V=>V.id===r.id),C=[...o.roles];C.splice(y,1,{...r,name:e});const x=ne.safeParse(C),b=!x.success;return b&&(s=x.error.issues[0].message),w(n||b),{result:!(n||b),helperText:s}},W=e=>{const{result:s,helperText:n}=O(e);s?t({...r,name:e}):D.post({display:"transient",severity:"error",message:n||"Please specify a valid role name."})},z=e=>{t({...r,description:e})},G=e=>{if(c===null)t({...r,permissions:[e,...r.permissions]});else{const s=[...r.permissions];s.splice(c,1,e),t({...r,permissions:s})}N.captureEvent("resource_action","update",{attributes:{resourceType:"role",resourceAction:"update",resourceId:l,subResourceType:"permission",subResourceAction:"update",subResourceId:e.id,rbacPermissionSetting:typeof e.decision=="string"?e.decision:"conditional",rbacFeatureFlags:S.join(",")}}),p(!1)},H=e=>{if(e==="*")t({...r,members:r.members==="*"?[]:"*"});else if(r.members==="*")t({...r,members:[e]});else{const s=r.members.includes(e)?r.members.filter(n=>n!==e):[...r.members,e];t({...r,members:s.length===0?"*":s})}},K=e=>{t({...r,permissions:r.permissions.filter((s,n)=>e!==n)})},L=e=>{t({...r,permissions:e})},a=o.status!=="draft",_=o.options.resolutionStrategy==="any-allow";return m(I,{children:[i(fe,{pages:[{label:"Policies",href:R},{label:o.name,href:`${R}/versions/${o.id}`}],pageTitle:h,primaryAction:i(Y,{variant:"outlined",color:"primary",onClick:()=>j("../..",{relative:"path"}),children:"Back to policy"}),children:m(u,{container:!0,className:E.cardContainer,spacing:4,direction:"row",children:[i(u,{item:!0,xs:12,children:m(ge,{children:[a?i(I,{children:h}):i(ue,{invalid:k,value:h,name:"Role name",onTextChange:W}),i(pe,{operation:g?.role.operation,size:"medium"})]})}),i(u,{item:!0,xs:6,children:m(ee,{children:[i(re,{title:"Description"}),i(ie,{children:i(oe,{fullWidth:!0,minRows:3,multiline:!0,variant:"outlined",value:r.description,disabled:a,placeholder:"No description",onChange:e=>z(e.target.value)})})]})}),m(u,{item:!0,xs:12,children:[i(T,{mb:4,children:i(he,{diff:g||null,role:r,policyId:o.id,onToggleMember:H,readonly:a})}),i(T,{mb:4,children:i(ye,{diff:g||null,permissions:r.permissions,onNewPermissionClick:()=>{v(null),p(!0)},onOpenPermission:e=>{v(e),p(!0)},onReorderPermissions:L,onRemovePermissionClick:K,anyAllow:_,readonly:a})})]})]})}),B&&i(ce,{rolePermission:c!==null?r.permissions[c]:void 0,onClose:()=>p(!1),onSave:G,readonly:a})]})}export{ve as RolePage,F as RolePageContent};
|
|
2
2
|
//# sourceMappingURL=RolePage.esm.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"homepage": "https://backstage.spotify.com",
|
|
7
7
|
"main": "./dist/index.esm.js",
|
|
@@ -57,27 +57,29 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@backstage/catalog-model": "^1.7.5",
|
|
60
|
-
"@backstage/core-compat-api": "^0.
|
|
61
|
-
"@backstage/core-components": "^0.
|
|
62
|
-
"@backstage/core-plugin-api": "^1.
|
|
60
|
+
"@backstage/core-compat-api": "^0.5.3",
|
|
61
|
+
"@backstage/core-components": "^0.18.2",
|
|
62
|
+
"@backstage/core-plugin-api": "^1.11.1",
|
|
63
63
|
"@backstage/errors": "^1.2.7",
|
|
64
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
65
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
66
|
-
"@backstage/plugin-permission-common": "^0.9.
|
|
67
|
-
"@backstage/plugin-permission-react": "^0.4.
|
|
68
|
-
"@backstage/theme": "^0.
|
|
69
|
-
"@backstage/types": "^1.2.
|
|
64
|
+
"@backstage/frontend-plugin-api": "^0.12.1",
|
|
65
|
+
"@backstage/plugin-catalog-react": "^1.21.2",
|
|
66
|
+
"@backstage/plugin-permission-common": "^0.9.2",
|
|
67
|
+
"@backstage/plugin-permission-react": "^0.4.37",
|
|
68
|
+
"@backstage/theme": "^0.7.0",
|
|
69
|
+
"@backstage/types": "^1.2.2",
|
|
70
|
+
"@backstage/ui": "^0.8.1",
|
|
70
71
|
"@material-ui/core": "^4.12.2",
|
|
71
72
|
"@material-ui/icons": "^4.9.1",
|
|
72
73
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
73
|
-
"@spotify/backstage-plugin-core": "^0.8.
|
|
74
|
-
"@spotify/backstage-plugin-rbac-common": "^0.6.
|
|
74
|
+
"@spotify/backstage-plugin-core": "^0.8.11",
|
|
75
|
+
"@spotify/backstage-plugin-rbac-common": "^0.6.10",
|
|
75
76
|
"ajv": "^8.11.2",
|
|
76
77
|
"file-saver": "^2.0.5",
|
|
77
78
|
"js-yaml": "^4.1.0",
|
|
78
79
|
"json-schema": "^0.4.0",
|
|
79
80
|
"lodash": "^4.17.21",
|
|
80
81
|
"luxon": "^3.1.1",
|
|
82
|
+
"react-helmet": "^6.1.0",
|
|
81
83
|
"react-use": "^17.2.4",
|
|
82
84
|
"react-virtualized": "^9.22.5",
|
|
83
85
|
"uuid": "^11.0.0",
|
|
@@ -90,12 +92,12 @@
|
|
|
90
92
|
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
91
93
|
},
|
|
92
94
|
"devDependencies": {
|
|
93
|
-
"@backstage/cli": "^0.
|
|
94
|
-
"@backstage/core-app-api": "^1.
|
|
95
|
-
"@backstage/dev-utils": "^1.1.
|
|
95
|
+
"@backstage/cli": "^0.34.4",
|
|
96
|
+
"@backstage/core-app-api": "^1.19.1",
|
|
97
|
+
"@backstage/dev-utils": "^1.1.16",
|
|
96
98
|
"@backstage/e2e-test-utils": "^0.1.1",
|
|
97
|
-
"@backstage/frontend-test-utils": "^0.
|
|
98
|
-
"@backstage/test-utils": "^1.7.
|
|
99
|
+
"@backstage/frontend-test-utils": "^0.4.0",
|
|
100
|
+
"@backstage/test-utils": "^1.7.12",
|
|
99
101
|
"@playwright/test": "^1.32.3",
|
|
100
102
|
"@sp4b-dev/test-utils": "^0.0.13",
|
|
101
103
|
"@testing-library/jest-dom": "^6.0.0",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{jsxs as c,jsx as e}from"react/jsx-runtime";import{Breadcrumbs as p,Link as t}from"@backstage/core-components";import{useRouteRef as n}from"@backstage/core-plugin-api";import{makeStyles as u,Typography as d}from"@material-ui/core";import{rootRouteRef as f}from"../../routes.esm.js";const l=u(r=>({breadcrumbs:{marginBottom:r.spacing(4)}}));function b({pages:r}){const a=n(f),s=l();return c(p,{className:s.breadcrumbs,children:[e(t,{to:a(),children:"Home"}),r.map(({title:m,path:o},i)=>o?e(t,{to:o,relative:"path",children:m},o):e(d,{children:m},`${i}`))]})}export{b as Breadcrumbs};
|
|
2
|
-
//# sourceMappingURL=Breadcrumbs.esm.js.map
|