@spotify/backstage-plugin-rbac 0.7.2 → 0.7.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 CHANGED
@@ -1,5 +1,20 @@
1
1
  # @spotify/backstage-plugin-rbac
2
2
 
3
+ ## 0.7.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Update to Backstage `v1.33.3`
8
+ - Fixed a bug that could cause namespaces from irrelevant entity kinds to be shown in the member selector.
9
+ - Role membership based on namespaces now supports groups (in addition to existing support for user namespaces).
10
+ - Updated dependency `uuid` to `^11.0.0`.
11
+ - Updated dependency `@types/node` to `^22.0.0`.
12
+ - Updated dependencies
13
+ - Updated dependencies
14
+ - Updated dependencies
15
+ - @spotify/backstage-plugin-core@0.8.3
16
+ - @spotify/backstage-plugin-rbac-common@0.6.3
17
+
3
18
  ## 0.7.2
4
19
 
5
20
  ### Patch Changes
package/dist/alpha.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import * as React from 'react';
3
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
4
- import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
4
+ import * as _backstage_core_plugin_api_index from '@backstage/core-plugin-api/index';
5
5
 
6
6
  /**
7
7
  * @public
@@ -12,10 +12,10 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
12
12
  name: undefined;
13
13
  config: {};
14
14
  configInput: {};
15
- output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_core_plugin_api.AnyApiFactory, "core.api.factory", {}>;
15
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_core_plugin_api_index.AnyApiFactory, "core.api.factory", {}>;
16
16
  inputs: {};
17
17
  params: {
18
- factory: _backstage_core_plugin_api.AnyApiFactory;
18
+ factory: _backstage_core_plugin_api_index.AnyApiFactory;
19
19
  };
20
20
  }>;
21
21
  "page:rbac": _backstage_frontend_plugin_api.ExtensionDefinition<{
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as u,DEFAULT_NAMESPACE as A}from"@backstage/catalog-model";import{humanizeEntityRef as C}from"@backstage/plugin-catalog-react";import{makeStyles as S,Box as k,Checkbox as P,TextField as F,CircularProgress as M}from"@material-ui/core";import{Autocomplete as O}from"@material-ui/lab";import t,{useState as L,useReducer as N,useEffect as w}from"react";import{MembersAutocompleteListBox as B}from"./MembersAutocompleteListBox.esm.js";const I=S({autocomplete:{display:"flex",flex:1}});function T({members:o,options:r,namespaceOptions:n,loading:a=!1,disabled:f=!1,isMultiNamespaces:s=!1,onTextChange:i,onToggleMember:E,onChange:b}){const[c,l]=L(!1),g=I(),[h,y]=N(e=>e+1,0),x=(e,p)=>{p&&(E(p),y())};w(()=>{c&&i("")},[c,i]);const R=s?n.concat(r?.members||[]):r?.members||[];return t.createElement(k,{width:250},t.createElement(O,{key:`${h}`,open:c,onOpen:()=>{l(!0)},onClose:()=>{l(!1)},onChange:x,getOptionLabel:m,groupBy:$,ListboxComponent:B,renderOption:e=>t.createElement(t.Fragment,null,t.createElement(P,{id:`checkbox-${e.entityRef}`,checked:o.includes(e.entityRef),color:"primary"}),t.createElement("label",{htmlFor:`checkbox-${e.entityRef}`},s?m(e,!1):m(e))),options:R,openOnFocus:!0,disabled:f,loading:a,className:g.autocomplete,renderInput:e=>t.createElement(F,{...e,label:s?"Select members":"Select specific users/groups",variant:"standard",onChange:b,InputProps:{...e.InputProps,endAdornment:t.createElement(t.Fragment,null,a?t.createElement(M,{color:"inherit",size:20}):null,e.InputProps.endAdornment)}})}))}function m(o,r=!0){const n=u(o.entityRef);return n.name==="*"?n.namespace:C({...n,name:o.name??n.name},{defaultKind:n.kind,defaultNamespace:r?A:!1})}const d={user:"USERS",group:"GROUPS",namespace:"NAMESPACES"};function $(o){const{name:r,kind:n}=u(o.entityRef),a=r==="*"?"namespace":n;if(!d[a])throw new Error(`Group '${a}' is not supported for members in a policy`);return d[a]}export{T as MembersAutocomplete,m as getLabel};
1
+ import{parseEntityRef as u,DEFAULT_NAMESPACE as A}from"@backstage/catalog-model";import{humanizeEntityRef as C}from"@backstage/plugin-catalog-react";import{makeStyles as S,Box as k,Checkbox as P,TextField as F,CircularProgress as M}from"@material-ui/core";import{Autocomplete as O}from"@material-ui/lab";import n,{useState as $,useReducer as L,useEffect as N}from"react";import{MembersAutocompleteListBox as w}from"./MembersAutocompleteListBox.esm.js";const I=S({autocomplete:{display:"flex",flex:1}});function T({members:o,options:r,namespaceOptions:t,loading:a=!1,disabled:f=!1,isMultiNamespaces:s=!1,onTextChange:i,onToggleMember:E,onChange:b}){const[c,l]=$(!1),g=I(),[h,y]=L(e=>e+1,0),x=(e,p)=>{p&&(E(p),y())};N(()=>{c&&i("")},[c,i]);const R=s?t.concat(r?.members||[]):r?.members||[];return n.createElement(k,{width:250},n.createElement(O,{key:`${h}`,open:c,onOpen:()=>{l(!0)},onClose:()=>{l(!1)},onChange:x,getOptionLabel:m,groupBy:B,ListboxComponent:w,renderOption:e=>n.createElement(n.Fragment,null,n.createElement(P,{id:`checkbox-${e.entityRef}`,checked:o.includes(e.entityRef),color:"primary"}),n.createElement("label",{htmlFor:`checkbox-${e.entityRef}`},s?m(e,!1):m(e))),options:R,openOnFocus:!0,disabled:f,loading:a,className:g.autocomplete,renderInput:e=>n.createElement(F,{...e,label:s?"Select members":"Select specific users/groups",variant:"standard",onChange:b,InputProps:{...e.InputProps,endAdornment:n.createElement(n.Fragment,null,a?n.createElement(M,{color:"inherit",size:20}):null,e.InputProps.endAdornment)}})}))}function m(o,r=!0){const t=u(o.entityRef);return t.name==="*"?`${t.kind}:${t.namespace}`:C({...t,name:o.name??t.name},{defaultKind:t.kind,defaultNamespace:r?A:!1})}const d={user:"USERS",group:"GROUPS",namespace:"NAMESPACES"};function B(o){const{name:r,kind:t}=u(o.entityRef),a=r==="*"?"namespace":t;if(!d[a])throw new Error(`Group '${a}' is not supported for members in a policy`);return d[a]}export{T as MembersAutocomplete,m as getLabel};
2
2
  //# sourceMappingURL=MembersAutocomplete.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as S}from"@backstage/catalog-model";import{useApi as E}from"@backstage/core-plugin-api";import{catalogApiRef as k}from"@backstage/plugin-catalog-react";import{makeStyles as F,debounce as O,Table as j,TableHead as B,TableRow as D,TableCell as m,TableBody as H}from"@material-ui/core";import t,{useState as P,useRef as U,useMemo as V}from"react";import C from"react-use/lib/useAsync";import{rbacApiRef as q}from"../../api.esm.js";import{useMemberOptions as z}from"./MemberOptionsProvider.esm.js";import{MembersAutocomplete as G}from"./MembersAutocomplete.esm.js";import J from"./MembersTableBody.esm.js";const K=F(()=>({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0}}));function Q({diff:s,policyId:n,role:a,onToggleMember:R,readonly:c=!1,debounceTime:p=1e3}){const h=E(q),f=E(k),o=K(),T=a.members==="*",[w,d]=P(""),{current:l}=U({}),u=e=>{l[e.entityRef]=e,R(e.entityRef)},b=e=>{if(l[e])return l[e];const r=S(e);return{entityRef:e,type:r.kind.toLowerCase(),name:r.name??e}},{value:M,loading:N}=z(),{loading:g,value:i}=C(async()=>{const e=await f.getEntityFacets({facets:["metadata.namespace"]}).then(r=>r.facets["metadata.namespace"].map(I=>I.value));return W(e)},[f]),y=i?i?.length>1:!1,L=i?i.filter(e=>e.entityRef.toLowerCase().includes(w)):[],v=V(()=>O(e=>{d(e.target.value.toLowerCase())},p),[d,p]),{loading:A,error:x}=C(async()=>{a.members==="*"||a.members.length===0||(await h.getPolicy(n)).roles.find(e=>e.id===a.id)===void 0||a.members.forEach(e=>{const r=b(e);l[r.entityRef]=r})},[n,T]);return t.createElement(t.Fragment,null,t.createElement("div",{className:o.header},t.createElement("h2",null,"Members"),t.createElement(G,{onToggleMember:u,members:a.members,disabled:c,options:M,namespaceOptions:L,isMultiNamespaces:y,loading:N||g,onTextChange:d,onChange:v})),t.createElement(j,{"data-testid":"membersTable"},t.createElement(B,null,t.createElement(D,null,t.createElement(m,{className:o.typeIconCol}),t.createElement(m,{className:o.nameCol},"Name"),t.createElement(m,null,"Type"),t.createElement(m,null),!c&&t.createElement(m,{className:o.actionCol}))),t.createElement(H,null,t.createElement(J,{diff:s,loading:A||g,isMultiNamespaces:y,error:x,members:Array.isArray(a.members)?a.members.map(b):a.members,onToggleMember:u,readonly:c}))))}function W(s){return s.map(n=>({name:"*",type:"user",entityRef:`user:${n}/*`})).sort((n,a)=>n.entityRef.toLowerCase().localeCompare(a.entityRef.toLowerCase()))}export{Q as MembersTable};
1
+ import{parseEntityRef as I}from"@backstage/catalog-model";import{useApi as E}from"@backstage/core-plugin-api";import{catalogApiRef as S}from"@backstage/plugin-catalog-react";import{makeStyles as F,debounce as O,Table as j,TableHead as B,TableRow as D,TableCell as m,TableBody as H}from"@material-ui/core";import t,{useState as P,useRef as U,useMemo as V}from"react";import C from"react-use/lib/useAsync";import{rbacApiRef as q}from"../../api.esm.js";import{useMemberOptions as z}from"./MemberOptionsProvider.esm.js";import{MembersAutocomplete as G}from"./MembersAutocomplete.esm.js";import J from"./MembersTableBody.esm.js";const K=F(()=>({header:{display:"flex",flexDirection:"row",justifyContent:"space-between",paddingLeft:"1rem",paddingRight:"1rem",gap:"1rem"},actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0}}));function Q({diff:s,policyId:r,role:a,onToggleMember:R,readonly:c=!1,debounceTime:f=1e3}){const h=E(q),d=E(S),o=K(),T=a.members==="*",[w,p]=P(""),{current:l}=U({}),u=e=>{l[e.entityRef]=e,R(e.entityRef)},g=e=>{if(l[e])return l[e];const n=I(e);return{entityRef:e,type:n.kind.toLowerCase(),name:n.name??e}},{value:M,loading:N}=z(),{loading:y,value:i}=C(async()=>{const e=await d.getEntityFacets({facets:["metadata.namespace"],filter:{kind:["group","user"]}}).then(n=>n.facets["metadata.namespace"].map(k=>k.value));return W(e)},[d]),b=i?i?.length>2:!1,L=i?i.filter(e=>e.entityRef.toLowerCase().includes(w)):[],v=V(()=>O(e=>{p(e.target.value.toLowerCase())},f),[p,f]),{loading:A,error:x}=C(async()=>{a.members==="*"||a.members.length===0||(await h.getPolicy(r)).roles.find(e=>e.id===a.id)===void 0||a.members.forEach(e=>{const n=g(e);l[n.entityRef]=n})},[r,T]);return t.createElement(t.Fragment,null,t.createElement("div",{className:o.header},t.createElement("h2",null,"Members"),t.createElement(G,{onToggleMember:u,members:a.members,disabled:c,options:M,namespaceOptions:L,isMultiNamespaces:b,loading:N||y,onTextChange:p,onChange:v})),t.createElement(j,{"data-testid":"membersTable"},t.createElement(B,null,t.createElement(D,null,t.createElement(m,{className:o.typeIconCol}),t.createElement(m,{className:o.nameCol},"Name"),t.createElement(m,null,"Type"),t.createElement(m,null),!c&&t.createElement(m,{className:o.actionCol}))),t.createElement(H,null,t.createElement(J,{diff:s,loading:A||y,isMultiNamespaces:b,error:x,members:Array.isArray(a.members)?a.members.map(g):a.members,onToggleMember:u,readonly:c}))))}function W(s){return s.map(r=>[{name:"*",type:"user",entityRef:`user:${r}/*`},{name:"*",type:"group",entityRef:`group:${r}/*`}]).flat().sort((r,a)=>r.entityRef.toLowerCase().localeCompare(a.entityRef.toLowerCase()))}export{Q as MembersTable};
2
2
  //# sourceMappingURL=MembersTable.esm.js.map
@@ -1,2 +1,2 @@
1
- import{parseEntityRef as s}from"@backstage/catalog-model";import{Progress as R}from"@backstage/core-components";import{makeStyles as b,TableRow as i,TableCell as a,IconButton as N}from"@material-ui/core";import h from"@material-ui/icons/Delete";import S from"@material-ui/icons/Group";import k from"@material-ui/icons/GroupWork";import B from"@material-ui/icons/Person";import e from"react";import{DiffBadge as u}from"../Diffing/DiffBadge.esm.js";import{getLabel as y}from"./MembersAutocomplete.esm.js";const M=b(m=>({actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0},typeIcon:{color:m.palette.grey[500]}}));function T({diff:m,loading:g,isMultiNamespaces:l,members:f,error:E,onToggleMember:d,readonly:c=!1}){const r=M();if(g)return e.createElement(i,null,e.createElement(a,{scope:"row",colSpan:c?4:5},e.createElement(R,null)));if(E&&E.message,f==="*")return e.createElement(i,null,e.createElement(a,{colSpan:2,height:80},"All"),e.createElement(a,{colSpan:c?2:3},e.createElement(u,{operation:m?.members["*"].operation})));if(f.length===0)return e.createElement(i,null,e.createElement(a,{scope:"row",colSpan:c?4:5},"Select users or groups using the drop-down menu above."));const C=f.sort((t,n)=>{let o=0;l&&n.name==="*"&&t.name!=="*"?o=1:l&&t.name==="*"&&n.name!=="*"&&(o=-1);const p=t.type.localeCompare(n.type),w=s(t.entityRef).namespace.localeCompare(s(n.entityRef).namespace),I=s(t.entityRef).name.localeCompare(s(n.entityRef).name);return o||p||w||I});return e.createElement(e.Fragment,null,C.map(t=>{const{name:n,type:o,entityRef:p}=t;return e.createElement(i,{key:p},e.createElement(a,{className:r.typeIconCol},o==="group"&&e.createElement(S,{className:r.typeIcon})||l&&n==="*"&&e.createElement(k,{className:r.typeIcon})||e.createElement(B,{className:r.typeIcon})),e.createElement(a,{scope:"row",className:r.nameCol},(l?y(t,!1):y(t))??"Unknown"),e.createElement(a,{scope:"row"},n==="*"&&l?"namespace":o),e.createElement(a,null,n&&e.createElement(u,{operation:m?.members[p].operation})),!c&&e.createElement(a,{scope:"row",className:r.actionCol},e.createElement(N,{"aria-label":"Remove member",onClick:()=>d(t),size:"small"},e.createElement(h,null))))}))}export{T as default};
1
+ import{parseEntityRef as s}from"@backstage/catalog-model";import{Progress as R}from"@backstage/core-components";import{makeStyles as b,TableRow as i,TableCell as a,IconButton as N}from"@material-ui/core";import h from"@material-ui/icons/Delete";import S from"@material-ui/icons/Group";import k from"@material-ui/icons/GroupWork";import B from"@material-ui/icons/Person";import e from"react";import{DiffBadge as u}from"../Diffing/DiffBadge.esm.js";import{getLabel as y}from"./MembersAutocomplete.esm.js";const M=b(m=>({actionCol:{width:48},typeIconCol:{paddingRight:"0.4rem"},nameCol:{paddingLeft:0},typeIcon:{color:m.palette.grey[500]}}));function T({diff:m,loading:g,isMultiNamespaces:l,members:f,error:E,onToggleMember:d,readonly:c=!1}){const r=M();if(g)return e.createElement(i,null,e.createElement(a,{scope:"row",colSpan:c?4:5},e.createElement(R,null)));if(E&&E.message,f==="*")return e.createElement(i,null,e.createElement(a,{colSpan:2,height:80},"All"),e.createElement(a,{colSpan:c?2:3},e.createElement(u,{operation:m?.members["*"].operation})));if(f.length===0)return e.createElement(i,null,e.createElement(a,{scope:"row",colSpan:c?4:5},"Select users or groups using the drop-down menu above."));const C=f.sort((t,n)=>{let o=0;l&&n.name==="*"&&t.name!=="*"?o=1:l&&t.name==="*"&&n.name!=="*"&&(o=-1);const p=t.type.localeCompare(n.type),w=s(t.entityRef).namespace.localeCompare(s(n.entityRef).namespace),I=s(t.entityRef).name.localeCompare(s(n.entityRef).name);return o||p||w||I});return e.createElement(e.Fragment,null,C.map(t=>{const{name:n,type:o,entityRef:p}=t;return e.createElement(i,{key:p},e.createElement(a,{className:r.typeIconCol},l&&n==="*"&&e.createElement(k,{className:r.typeIcon})||o==="group"&&e.createElement(S,{className:r.typeIcon})||e.createElement(B,{className:r.typeIcon})),e.createElement(a,{scope:"row",className:r.nameCol},(l?y(t,!1):y(t))??"Unknown"),e.createElement(a,{scope:"row"},n==="*"&&l?"namespace":o),e.createElement(a,null,n&&e.createElement(u,{operation:m?.members[p].operation})),!c&&e.createElement(a,{scope:"row",className:r.actionCol},e.createElement(N,{"aria-label":"Remove member",onClick:()=>d(t),size:"small"},e.createElement(h,null))))}))}export{T as default};
2
2
  //# sourceMappingURL=MembersTableBody.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.7.2",
4
+ "version": "0.7.3",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -32,6 +32,16 @@
32
32
  },
33
33
  "./package.json": "./package.json"
34
34
  },
35
+ "typesVersions": {
36
+ "*": {
37
+ "index": [
38
+ "dist/index.d.ts"
39
+ ],
40
+ "alpha": [
41
+ "dist/alpha.d.ts"
42
+ ]
43
+ }
44
+ },
35
45
  "scripts": {
36
46
  "start": "backstage-cli package start",
37
47
  "build": "backstage-cli package build --minify",
@@ -43,22 +53,22 @@
43
53
  "a11y": "yarn dlx @lhci/cli@0.13.x --config ./.lighthouserc.js autorun"
44
54
  },
45
55
  "dependencies": {
46
- "@backstage/catalog-model": "^1.7.0",
47
- "@backstage/core-compat-api": "^0.3.1",
48
- "@backstage/core-components": "^0.15.1",
49
- "@backstage/core-plugin-api": "^1.10.0",
50
- "@backstage/errors": "^1.2.4",
51
- "@backstage/frontend-plugin-api": "^0.9.0",
52
- "@backstage/plugin-catalog-react": "^1.14.0",
53
- "@backstage/plugin-permission-common": "^0.8.1",
54
- "@backstage/plugin-permission-react": "^0.4.27",
55
- "@backstage/theme": "^0.6.0",
56
- "@backstage/types": "^1.1.1",
56
+ "@backstage/catalog-model": "^1.7.1",
57
+ "@backstage/core-compat-api": "^0.3.3",
58
+ "@backstage/core-components": "^0.16.1",
59
+ "@backstage/core-plugin-api": "^1.10.1",
60
+ "@backstage/errors": "^1.2.5",
61
+ "@backstage/frontend-plugin-api": "^0.9.2",
62
+ "@backstage/plugin-catalog-react": "^1.14.2",
63
+ "@backstage/plugin-permission-common": "^0.8.2",
64
+ "@backstage/plugin-permission-react": "^0.4.28",
65
+ "@backstage/theme": "^0.6.2",
66
+ "@backstage/types": "^1.2.0",
57
67
  "@material-ui/core": "^4.12.2",
58
68
  "@material-ui/icons": "^4.9.1",
59
69
  "@material-ui/lab": "4.0.0-alpha.61",
60
- "@spotify/backstage-plugin-core": "^0.8.2",
61
- "@spotify/backstage-plugin-rbac-common": "^0.6.2",
70
+ "@spotify/backstage-plugin-core": "^0.8.3",
71
+ "@spotify/backstage-plugin-rbac-common": "^0.6.3",
62
72
  "ajv": "^8.11.2",
63
73
  "file-saver": "^2.0.5",
64
74
  "js-yaml": "^4.1.0",
@@ -67,7 +77,7 @@
67
77
  "luxon": "^3.1.1",
68
78
  "react-use": "^17.2.4",
69
79
  "react-virtualized": "^9.22.5",
70
- "uuid": "^10.0.0",
80
+ "uuid": "^11.0.0",
71
81
  "zod": "^3.20.0",
72
82
  "zod-to-json-schema": "^3.20.2"
73
83
  },
@@ -77,20 +87,20 @@
77
87
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
78
88
  },
79
89
  "devDependencies": {
80
- "@backstage/cli": "^0.28.0",
81
- "@backstage/core-app-api": "^1.15.1",
82
- "@backstage/dev-utils": "^1.1.2",
90
+ "@backstage/cli": "^0.29.2",
91
+ "@backstage/core-app-api": "^1.15.2",
92
+ "@backstage/dev-utils": "^1.1.4",
83
93
  "@backstage/e2e-test-utils": "^0.1.1",
84
- "@backstage/frontend-test-utils": "^0.2.1",
85
- "@backstage/test-utils": "^1.7.0",
94
+ "@backstage/frontend-test-utils": "^0.2.3",
95
+ "@backstage/test-utils": "^1.7.2",
86
96
  "@playwright/test": "^1.32.3",
87
- "@sp4b-dev/test-utils": "^0.0.8",
97
+ "@sp4b-dev/test-utils": "^0.0.9",
88
98
  "@testing-library/jest-dom": "^6.0.0",
89
99
  "@testing-library/react": "^14.0.0",
90
100
  "@testing-library/user-event": "^14.0.0",
91
101
  "@types/file-saver": "^2.0.5",
92
102
  "@types/jest": "^29.4.0",
93
- "@types/node": "^20.0.0",
103
+ "@types/node": "^22.0.0",
94
104
  "@types/react-virtualized": "^9.21.21",
95
105
  "cross-fetch": "^4.0.0",
96
106
  "msw": "^1.0.0"
@@ -98,8 +108,7 @@
98
108
  "files": [
99
109
  "dist",
100
110
  "!dist/**/*.map",
101
- "config.d.ts",
102
- "alpha"
111
+ "config.d.ts"
103
112
  ],
104
113
  "configSchema": "config.d.ts",
105
114
  "module": "./dist/index.esm.js"
@@ -1,7 +0,0 @@
1
- {
2
- "name": "@spotify/backstage-plugin-rbac__alpha",
3
- "version": "0.7.2",
4
- "main": "../dist/alpha.esm.js",
5
- "module": "../dist/alpha.esm.js",
6
- "types": "../dist/alpha.d.ts"
7
- }