@secustor/backstage-plugin-renovate 0.17.1 → 0.17.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 +20 -0
- package/README.md +2 -2
- package/dist/alpha.d.ts +35 -29
- package/dist/alpha.esm.js +17 -19
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api.esm.js.map +1 -1
- package/dist/components/DependencyTable/CustomToolbar.esm.js.map +1 -1
- package/dist/components/DependencyTable/DependencyTable.esm.js.map +1 -1
- package/dist/components/DependencyTable/Filters.esm.js.map +1 -1
- package/dist/components/DependencyTable/defaultColumns.esm.js.map +1 -1
- package/dist/components/EntityRenovateContent/EntityRenovateContent.esm.js +1 -1
- package/dist/components/EntityRenovateContent/EntityRenovateContent.esm.js.map +1 -1
- package/dist/components/RenovateDefaultOverview/RenovateDefaultOverview.esm.js.map +1 -1
- package/dist/components/RenovateReportEmptyState/RenovateEmptyState.esm.js.map +1 -1
- package/dist/components/RenovateStarter/RenovateStarter.esm.js.map +1 -1
- package/dist/components/ReportFetchComponent/InspectReportDialog.esm.js.map +1 -1
- package/dist/components/ReportFetchComponent/ReportFetchComponent.esm.js.map +1 -1
- package/dist/components/StartRenovateButton/StartRenovateButton.esm.js.map +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/tools/versioning.esm.js.map +1 -1
- package/package.json +16 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @secustor/backstage-plugin-renovate
|
|
2
2
|
|
|
3
|
+
## 0.17.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`01a41bd`](https://github.com/secustor/backstage-plugins/commit/01a41bdbfb456fcbe6af1dfcf56143d6c59aef7c) Thanks [@renovate[bot]](https://github.com/renovate%5Bbot%5D)! - Bump Backstage to 1.42.1
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`01a41bd`](https://github.com/secustor/backstage-plugins/commit/01a41bdbfb456fcbe6af1dfcf56143d6c59aef7c)]:
|
|
10
|
+
- @secustor/backstage-plugin-renovate-client@0.10.7
|
|
11
|
+
- @secustor/backstage-plugin-renovate-common@0.9.3
|
|
12
|
+
|
|
13
|
+
## 0.17.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#744](https://github.com/secustor/backstage-plugins/pull/744) [`8670607`](https://github.com/secustor/backstage-plugins/commit/8670607b4aa74c468a53523c6ef35b73487f0877) Thanks [@renovate](https://github.com/apps/renovate)! - Upgrade Backstage to 1.40.0
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`8670607`](https://github.com/secustor/backstage-plugins/commit/8670607b4aa74c468a53523c6ef35b73487f0877)]:
|
|
20
|
+
- @secustor/backstage-plugin-renovate-client@0.10.6
|
|
21
|
+
- @secustor/backstage-plugin-renovate-common@0.9.2
|
|
22
|
+
|
|
3
23
|
## 0.17.1
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -17,14 +17,14 @@ Install the plugin:
|
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
# Install packages from the root directory
|
|
20
|
-
yarn --cwd packages/app add @
|
|
20
|
+
yarn --cwd packages/app add @secustor/backstage-plugin-renovate
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
Add the plugin to your Backstage instance:
|
|
24
24
|
|
|
25
25
|
```tsx
|
|
26
26
|
// Add the following to `packages/app/src/App.tsx`
|
|
27
|
-
import { RenovatePage } from '@
|
|
27
|
+
import { RenovatePage } from '@secustor/backstage-plugin-renovate';
|
|
28
28
|
|
|
29
29
|
const routes = (
|
|
30
30
|
<FlatRoutes>
|
package/dist/alpha.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
2
2
|
import * as _backstage_catalog_model from '@backstage/catalog-model';
|
|
3
3
|
import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
|
|
4
|
-
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
5
4
|
import * as react from 'react';
|
|
5
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
6
6
|
|
|
7
|
-
declare const
|
|
7
|
+
declare const renovatePage: _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
8
8
|
kind: "page";
|
|
9
9
|
name: undefined;
|
|
10
10
|
config: {
|
|
@@ -13,12 +13,13 @@ declare const RenovatePage: _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
|
13
13
|
configInput: {
|
|
14
14
|
path?: string | undefined;
|
|
15
15
|
};
|
|
16
|
-
output: _backstage_frontend_plugin_api.
|
|
16
|
+
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", {
|
|
17
17
|
optional: true;
|
|
18
18
|
}>;
|
|
19
19
|
inputs: {};
|
|
20
20
|
params: {
|
|
21
|
-
defaultPath:
|
|
21
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
22
|
+
path: string;
|
|
22
23
|
loader: () => Promise<JSX.Element>;
|
|
23
24
|
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
24
25
|
};
|
|
@@ -38,40 +39,41 @@ declare const EntityRenovateContent: _backstage_frontend_plugin_api.ExtensionDef
|
|
|
38
39
|
path?: string | undefined;
|
|
39
40
|
group?: string | false | undefined;
|
|
40
41
|
};
|
|
41
|
-
output: _backstage_frontend_plugin_api.
|
|
42
|
+
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", {
|
|
42
43
|
optional: true;
|
|
43
|
-
}> | _backstage_frontend_plugin_api.
|
|
44
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
44
45
|
optional: true;
|
|
45
|
-
}> | _backstage_frontend_plugin_api.
|
|
46
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
46
47
|
optional: true;
|
|
47
|
-
}> | _backstage_frontend_plugin_api.
|
|
48
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
|
|
48
49
|
optional: true;
|
|
49
50
|
}>;
|
|
50
51
|
inputs: {};
|
|
51
52
|
params: {
|
|
53
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
54
|
+
path: string;
|
|
55
|
+
defaultTitle?: [Error: `Use the 'title' param instead`];
|
|
56
|
+
title: string;
|
|
57
|
+
defaultGroup?: [Error: `Use the 'group' param instead`];
|
|
58
|
+
group?: ("overview" | "documentation" | "development" | "deployment" | "operation" | "observability") | (string & {});
|
|
52
59
|
loader: () => Promise<JSX.Element>;
|
|
53
|
-
defaultPath: string;
|
|
54
|
-
defaultTitle: string;
|
|
55
|
-
defaultGroup?: ("overview" | "documentation" | "development" | "deployment" | "operation" | "observability") | (string & {});
|
|
56
60
|
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
57
61
|
filter?: string | _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
58
62
|
};
|
|
59
63
|
}>;
|
|
60
|
-
declare const _default: _backstage_frontend_plugin_api.
|
|
64
|
+
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
61
65
|
root: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
62
66
|
}, {}, {
|
|
63
|
-
|
|
67
|
+
"api:renovate": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
64
68
|
kind: "api";
|
|
65
69
|
name: undefined;
|
|
66
70
|
config: {};
|
|
67
71
|
configInput: {};
|
|
68
|
-
output: _backstage_frontend_plugin_api.
|
|
72
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_core_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
69
73
|
inputs: {};
|
|
70
|
-
params: {
|
|
71
|
-
factory: _backstage_core_plugin_api.AnyApiFactory;
|
|
72
|
-
};
|
|
74
|
+
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>;
|
|
73
75
|
}>;
|
|
74
|
-
|
|
76
|
+
"entity-content:renovate": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
75
77
|
kind: "entity-content";
|
|
76
78
|
name: undefined;
|
|
77
79
|
config: {
|
|
@@ -86,26 +88,29 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
|
|
|
86
88
|
path?: string | undefined;
|
|
87
89
|
group?: string | false | undefined;
|
|
88
90
|
};
|
|
89
|
-
output: _backstage_frontend_plugin_api.
|
|
91
|
+
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", {
|
|
90
92
|
optional: true;
|
|
91
|
-
}> | _backstage_frontend_plugin_api.
|
|
93
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
92
94
|
optional: true;
|
|
93
|
-
}> | _backstage_frontend_plugin_api.
|
|
95
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
94
96
|
optional: true;
|
|
95
|
-
}> | _backstage_frontend_plugin_api.
|
|
97
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
|
|
96
98
|
optional: true;
|
|
97
99
|
}>;
|
|
98
100
|
inputs: {};
|
|
99
101
|
params: {
|
|
102
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
103
|
+
path: string;
|
|
104
|
+
defaultTitle?: [Error: `Use the 'title' param instead`];
|
|
105
|
+
title: string;
|
|
106
|
+
defaultGroup?: [Error: `Use the 'group' param instead`];
|
|
107
|
+
group?: ("overview" | "documentation" | "development" | "deployment" | "operation" | "observability") | (string & {});
|
|
100
108
|
loader: () => Promise<JSX.Element>;
|
|
101
|
-
defaultPath: string;
|
|
102
|
-
defaultTitle: string;
|
|
103
|
-
defaultGroup?: ("overview" | "documentation" | "development" | "deployment" | "operation" | "observability") | (string & {});
|
|
104
109
|
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
105
110
|
filter?: string | _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
106
111
|
};
|
|
107
112
|
}>;
|
|
108
|
-
|
|
113
|
+
"page:renovate": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
109
114
|
kind: "page";
|
|
110
115
|
name: undefined;
|
|
111
116
|
config: {
|
|
@@ -114,16 +119,17 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
|
|
|
114
119
|
configInput: {
|
|
115
120
|
path?: string | undefined;
|
|
116
121
|
};
|
|
117
|
-
output: _backstage_frontend_plugin_api.
|
|
122
|
+
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", {
|
|
118
123
|
optional: true;
|
|
119
124
|
}>;
|
|
120
125
|
inputs: {};
|
|
121
126
|
params: {
|
|
122
|
-
defaultPath:
|
|
127
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
128
|
+
path: string;
|
|
123
129
|
loader: () => Promise<JSX.Element>;
|
|
124
130
|
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
125
131
|
};
|
|
126
132
|
}>;
|
|
127
133
|
}>;
|
|
128
134
|
|
|
129
|
-
export { EntityRenovateContent,
|
|
135
|
+
export { EntityRenovateContent, _default as default, renovatePage };
|
package/dist/alpha.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { fetchApiRef, discoveryApiRef } from '@backstage/core-plugin-api';
|
|
3
3
|
import { PageBlueprint, ApiBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
4
4
|
import { convertLegacyRouteRef, compatWrapper, convertLegacyRouteRefs } from '@backstage/core-compat-api';
|
|
5
5
|
import { rootRouteRef } from './routes.esm.js';
|
|
@@ -7,9 +7,9 @@ import { renovateApiRef } from './api.esm.js';
|
|
|
7
7
|
import { RenovateClient } from '@secustor/backstage-plugin-renovate-client';
|
|
8
8
|
import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
9
9
|
|
|
10
|
-
const
|
|
10
|
+
const renovatePage = PageBlueprint.make({
|
|
11
11
|
params: {
|
|
12
|
-
|
|
12
|
+
path: "/renovate",
|
|
13
13
|
// TODO remove converter when fully migrated to the new system
|
|
14
14
|
routeRef: convertLegacyRouteRef(rootRouteRef),
|
|
15
15
|
loader: () => import('./components/RenovateDefaultOverview/index.esm.js').then(
|
|
@@ -19,32 +19,30 @@ const RenovatePage = PageBlueprint.make({
|
|
|
19
19
|
});
|
|
20
20
|
const EntityRenovateContent = EntityContentBlueprint.make({
|
|
21
21
|
params: {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
path: "/renovate",
|
|
23
|
+
title: "Renovate",
|
|
24
24
|
loader: () => import('./components/EntityRenovateContent/index.esm.js').then(
|
|
25
25
|
(m) => compatWrapper(/* @__PURE__ */ jsx(m.EntityRenovateContent, {}))
|
|
26
26
|
)
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
|
-
const
|
|
30
|
-
params: {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
39
|
-
}
|
|
29
|
+
const renovateApi = ApiBlueprint.make({
|
|
30
|
+
params: (defineParams) => defineParams({
|
|
31
|
+
api: renovateApiRef,
|
|
32
|
+
deps: {
|
|
33
|
+
discoveryApi: discoveryApiRef,
|
|
34
|
+
fetchApi: fetchApiRef
|
|
35
|
+
},
|
|
36
|
+
factory: ({ discoveryApi, fetchApi }) => new RenovateClient({ discoveryApi, fetchApi })
|
|
37
|
+
})
|
|
40
38
|
});
|
|
41
39
|
var alpha = createFrontendPlugin({
|
|
42
|
-
|
|
43
|
-
extensions: [
|
|
40
|
+
pluginId: "renovate",
|
|
41
|
+
extensions: [renovatePage, renovateApi, EntityRenovateContent],
|
|
44
42
|
routes: convertLegacyRouteRefs({
|
|
45
43
|
root: rootRouteRef
|
|
46
44
|
})
|
|
47
45
|
});
|
|
48
46
|
|
|
49
|
-
export { EntityRenovateContent,
|
|
47
|
+
export { EntityRenovateContent, alpha as default, renovatePage };
|
|
50
48
|
//# sourceMappingURL=alpha.esm.js.map
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["import { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api';\nimport {\n ApiBlueprint,\n createFrontendPlugin,\n} from '@backstage/frontend-plugin-api';\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { rootRouteRef } from './routes';\nimport { renovateApiRef } from './api';\nimport { RenovateClient } from '@secustor/backstage-plugin-renovate-client';\nimport { PageBlueprint } from '@backstage/frontend-plugin-api';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n} from '@backstage/core-compat-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\nexport const renovatePage = PageBlueprint.make({\n params: {\n path: '/renovate',\n // TODO remove converter when fully migrated to the new system\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: () =>\n import('./components/RenovateDefaultOverview').then(m =>\n compatWrapper(<m.RenovateDefaultOverview />),\n ),\n },\n});\n\nexport const EntityRenovateContent = EntityContentBlueprint.make({\n params: {\n path: '/renovate',\n title: 'Renovate',\n loader: () =>\n import('./components/EntityRenovateContent').then(m =>\n compatWrapper(<m.EntityRenovateContent />),\n ),\n },\n});\n\nconst renovateApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: renovateApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, fetchApi }) =>\n new RenovateClient({ discoveryApi, fetchApi }),\n }),\n});\n\nexport default createFrontendPlugin({\n pluginId: 'renovate',\n extensions: [renovatePage, renovateApi, EntityRenovateContent],\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n }),\n});\n"],"names":[],"mappings":";;;;;;;;;AAgBO,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK;AAAA,EAC7C,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA;AAAA,IAEN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,MAAA,EAAQ,MACN,OAAO,mDAAsC,CAAA,CAAE,IAAA;AAAA,MAAK,OAClD,aAAA,iBAAc,GAAA,CAAC,CAAA,CAAE,uBAAA,EAAF,EAA0B,CAAE;AAAA;AAC7C;AAEN,CAAC;AAEM,MAAM,qBAAA,GAAwB,uBAAuB,IAAA,CAAK;AAAA,EAC/D,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,MACN,OAAO,iDAAoC,CAAA,CAAE,IAAA;AAAA,MAAK,OAChD,aAAA,iBAAc,GAAA,CAAC,CAAA,CAAE,qBAAA,EAAF,EAAwB,CAAE;AAAA;AAC3C;AAEN,CAAC;AAED,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK;AAAA,EACpC,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,cAAA;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,eAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KACjC,IAAI,cAAA,CAAe,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,GAChD;AACL,CAAC,CAAA;AAED,YAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,CAAC,YAAA,EAAc,WAAA,EAAa,qBAAqB,CAAA;AAAA,EAC7D,QAAQ,sBAAA,CAAuB;AAAA,IAC7B,IAAA,EAAM;AAAA,GACP;AACH,CAAC,CAAA;;;;"}
|
package/dist/api.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\nimport { RenovateClient } from '@secustor/backstage-plugin-renovate-client';\n\nexport const renovateApiRef = createApiRef<RenovateClient>({\n id: 'plugin.renovate.service',\n});\n"],"names":[],"mappings":";;AAGO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["import { createApiRef } from '@backstage/core-plugin-api';\nimport { RenovateClient } from '@secustor/backstage-plugin-renovate-client';\n\nexport const renovateApiRef = createApiRef<RenovateClient>({\n id: 'plugin.renovate.service',\n});\n"],"names":[],"mappings":";;AAGO,MAAM,iBAAiB,YAAA,CAA6B;AAAA,EACzD,EAAA,EAAI;AACN,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomToolbar.esm.js","sources":["../../../src/components/DependencyTable/CustomToolbar.tsx"],"sourcesContent":["import {\n GridToolbarColumnsButton,\n QuickFilter,\n Toolbar,\n GridFilterListIcon,\n GridSlotsComponentsProps,\n QuickFilterControl,\n QuickFilterClear,\n ExportCsv,\n} from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { Filters } from './Filters';\nimport type { FilterableColumnDef } from './types';\nimport Dialog from '@mui/material/Dialog';\nimport { styled } from '@mui/material/styles';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport SearchIcon from '@mui/icons-material/Search';\nimport CancelIcon from '@mui/icons-material/Cancel';\nimport FileDownloadIcon from '@mui/icons-material/FileDownload';\nimport Tooltip from '@mui/material/Tooltip';\n\ndeclare module '@mui/x-data-grid' {\n interface ToolbarPropsOverrides {\n selectedFilters?: Record<string, string[]>;\n onUpdateFilters?: (filters: Record<string, string[]>) => void;\n filterAbleColumns?: FilterableColumnDef[];\n }\n}\n\nconst StyledQuickFilter = styled(QuickFilter)({\n marginLeft: 'auto',\n});\n\nexport function CustomToolbar(\n props: NonNullable<GridSlotsComponentsProps['toolbar']>,\n) {\n const [filterOpen, toggleFilterOpen] = useState(false);\n\n const filters =\n props.filterAbleColumns?.filter(column => column.isFilterable ?? true) ??\n [];\n\n return (\n <Toolbar>\n <Button\n title=\"Open filter drawer\"\n startIcon={<GridFilterListIcon />}\n onClick={() => toggleFilterOpen(true)}\n disabled={!props.filterAbleColumns?.length}\n >\n Filters\n </Button>\n {filters.length && (\n <Dialog open={filterOpen} onClose={() => toggleFilterOpen(false)}>\n <Filters\n filters={filters}\n selectedFilters={props.selectedFilters}\n onChangeFilters={props.onUpdateFilters}\n />\n </Dialog>\n )}\n\n <GridToolbarColumnsButton />\n <Box sx={{ flexGrow: 1 }} />\n <StyledQuickFilter expanded>\n <QuickFilterControl\n render={({ ref, ...other }) => (\n <TextField\n {...other}\n sx={{ width: 260 }}\n inputRef={ref}\n aria-label=\"Search\"\n placeholder=\"Search...\"\n size=\"small\"\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: other.value ? (\n <InputAdornment position=\"end\">\n <QuickFilterClear\n edge=\"end\"\n size=\"small\"\n aria-label=\"Clear search\"\n >\n <CancelIcon fontSize=\"small\" />\n </QuickFilterClear>\n </InputAdornment>\n ) : null,\n ...other.slotProps?.input,\n },\n ...other.slotProps,\n }}\n />\n )}\n />\n </StyledQuickFilter>\n <Tooltip title=\"Download as CSV\">\n <ExportCsv\n options={{\n fileName: 'dependencies',\n }}\n render={\n <Button startIcon={<FileDownloadIcon fontSize=\"small\" />}>\n EXPORT\n </Button>\n }\n />\n </Tooltip>\n </Toolbar>\n );\n}\n\nexport class CustomToolBarProps {}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCA,MAAM,iBAAA,GAAoB,
|
|
1
|
+
{"version":3,"file":"CustomToolbar.esm.js","sources":["../../../src/components/DependencyTable/CustomToolbar.tsx"],"sourcesContent":["import {\n GridToolbarColumnsButton,\n QuickFilter,\n Toolbar,\n GridFilterListIcon,\n GridSlotsComponentsProps,\n QuickFilterControl,\n QuickFilterClear,\n ExportCsv,\n} from '@mui/x-data-grid';\nimport { useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { Filters } from './Filters';\nimport type { FilterableColumnDef } from './types';\nimport Dialog from '@mui/material/Dialog';\nimport { styled } from '@mui/material/styles';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport SearchIcon from '@mui/icons-material/Search';\nimport CancelIcon from '@mui/icons-material/Cancel';\nimport FileDownloadIcon from '@mui/icons-material/FileDownload';\nimport Tooltip from '@mui/material/Tooltip';\n\ndeclare module '@mui/x-data-grid' {\n interface ToolbarPropsOverrides {\n selectedFilters?: Record<string, string[]>;\n onUpdateFilters?: (filters: Record<string, string[]>) => void;\n filterAbleColumns?: FilterableColumnDef[];\n }\n}\n\nconst StyledQuickFilter = styled(QuickFilter)({\n marginLeft: 'auto',\n});\n\nexport function CustomToolbar(\n props: NonNullable<GridSlotsComponentsProps['toolbar']>,\n) {\n const [filterOpen, toggleFilterOpen] = useState(false);\n\n const filters =\n props.filterAbleColumns?.filter(column => column.isFilterable ?? true) ??\n [];\n\n return (\n <Toolbar>\n <Button\n title=\"Open filter drawer\"\n startIcon={<GridFilterListIcon />}\n onClick={() => toggleFilterOpen(true)}\n disabled={!props.filterAbleColumns?.length}\n >\n Filters\n </Button>\n {filters.length && (\n <Dialog open={filterOpen} onClose={() => toggleFilterOpen(false)}>\n <Filters\n filters={filters}\n selectedFilters={props.selectedFilters}\n onChangeFilters={props.onUpdateFilters}\n />\n </Dialog>\n )}\n\n <GridToolbarColumnsButton />\n <Box sx={{ flexGrow: 1 }} />\n <StyledQuickFilter expanded>\n <QuickFilterControl\n render={({ ref, ...other }) => (\n <TextField\n {...other}\n sx={{ width: 260 }}\n inputRef={ref}\n aria-label=\"Search\"\n placeholder=\"Search...\"\n size=\"small\"\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n endAdornment: other.value ? (\n <InputAdornment position=\"end\">\n <QuickFilterClear\n edge=\"end\"\n size=\"small\"\n aria-label=\"Clear search\"\n >\n <CancelIcon fontSize=\"small\" />\n </QuickFilterClear>\n </InputAdornment>\n ) : null,\n ...other.slotProps?.input,\n },\n ...other.slotProps,\n }}\n />\n )}\n />\n </StyledQuickFilter>\n <Tooltip title=\"Download as CSV\">\n <ExportCsv\n options={{\n fileName: 'dependencies',\n }}\n render={\n <Button startIcon={<FileDownloadIcon fontSize=\"small\" />}>\n EXPORT\n </Button>\n }\n />\n </Tooltip>\n </Toolbar>\n );\n}\n\nexport class CustomToolBarProps {}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependencyTable.esm.js","sources":["../../../src/components/DependencyTable/DependencyTable.tsx"],"sourcesContent":["import { useState, ReactElement, useMemo } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport { defaultColumns } from './defaultColumns';\nimport { DataGrid } from '@mui/x-data-grid/DataGrid';\nimport Box from '@mui/material/Box';\nimport { makeStyles } from '@mui/styles';\nimport { CustomToolbar } from './CustomToolbar';\nimport type { DependencyTableV2Props, FilterableColumnDef } from './types';\nimport type { DependenciesGet200ResponseAvailableValues } from '@secustor/backstage-plugin-renovate-client';\nimport { useQueryParamState } from '@backstage/core-components';\nimport { GridColumnVisibilityModel } from '@mui/x-data-grid';\n\nconst useTableStyles = makeStyles(\n {\n root: {\n display: 'flex',\n },\n grid: {\n height: '80vh',\n },\n },\n { name: 'DependencyTable' },\n);\n\nexport function DependencyTable(props: DependencyTableV2Props): ReactElement {\n const renovateAPI = useApi(renovateApiRef);\n const alertAPI = useApi(alertApiRef);\n\n const tableClasses = useTableStyles();\n\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 100,\n });\n\n const [selectedFilters, setSelectedFilters] =\n useQueryParamState<Record<string, string[]>>('filters');\n\n const { value, loading, error } = useAsync(async () => {\n const response = await renovateAPI.dependenciesGet({\n query: {\n latestOnly: true,\n availableValues: true,\n ...paginationModel,\n ...selectedFilters,\n },\n });\n const { dependencies, availableValues } = await response.json();\n\n const totalCountHeader = response.headers.get('X-Total-Count');\n const totalCount = totalCountHeader\n ? Number.parseInt(totalCountHeader, 10)\n : dependencies.length;\n return {\n dependencies,\n availableValues,\n totalCount,\n };\n }, [paginationModel, selectedFilters]);\n\n if (error) {\n alertAPI.post({\n severity: 'error',\n message: error.message,\n });\n }\n\n const filterAbleColumns = useMemo(() => {\n const columns = props.columns ?? defaultColumns;\n const columnsWithOptions: FilterableColumnDef[] = columns.map(column => {\n const availableValues = value?.availableValues;\n if (!availableValues) {\n return column;\n }\n\n const field = column.field;\n if (field in availableValues) {\n return {\n ...column,\n filterOptions:\n availableValues[\n field as keyof DependenciesGet200ResponseAvailableValues\n ],\n };\n }\n return column;\n });\n\n return columnsWithOptions;\n }, [props.columns, value?.availableValues]);\n\n const columnVisibilityModel = useMemo(() => {\n const model: GridColumnVisibilityModel = {};\n for (const column of filterAbleColumns) {\n model[column.field] = !column.isHiddenOnInit;\n }\n return model;\n }, [filterAbleColumns]);\n\n return (\n <Box className={tableClasses.root}>\n <DataGrid\n // theming\n className={tableClasses.grid}\n // toolbar\n showToolbar\n // columns\n disableColumnMenu\n columns={filterAbleColumns}\n // rows\n rows={value?.dependencies ?? []}\n rowCount={value?.totalCount}\n loading={loading}\n // pagination\n pageSizeOptions={[]} // do not show the page size selector\n paginationMode=\"server\"\n paginationModel={paginationModel}\n onPaginationModelChange={model => setPaginationModel(model)}\n // init\n initialState={{\n columns: {\n columnVisibilityModel,\n },\n }}\n // sub component customization\n slots={{\n toolbar: CustomToolbar,\n }}\n slotProps={{\n toolbar: {\n filterAbleColumns,\n selectedFilters,\n onUpdateFilters: (filters: Record<string, string[]>) => {\n setSelectedFilters(filters);\n\n // Reset pagination when filters are updated\n setPaginationModel({\n page: 0,\n pageSize: paginationModel.pageSize,\n });\n },\n },\n }}\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAcA,MAAM,
|
|
1
|
+
{"version":3,"file":"DependencyTable.esm.js","sources":["../../../src/components/DependencyTable/DependencyTable.tsx"],"sourcesContent":["import { useState, ReactElement, useMemo } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport { defaultColumns } from './defaultColumns';\nimport { DataGrid } from '@mui/x-data-grid/DataGrid';\nimport Box from '@mui/material/Box';\nimport { makeStyles } from '@mui/styles';\nimport { CustomToolbar } from './CustomToolbar';\nimport type { DependencyTableV2Props, FilterableColumnDef } from './types';\nimport type { DependenciesGet200ResponseAvailableValues } from '@secustor/backstage-plugin-renovate-client';\nimport { useQueryParamState } from '@backstage/core-components';\nimport { GridColumnVisibilityModel } from '@mui/x-data-grid';\n\nconst useTableStyles = makeStyles(\n {\n root: {\n display: 'flex',\n },\n grid: {\n height: '80vh',\n },\n },\n { name: 'DependencyTable' },\n);\n\nexport function DependencyTable(props: DependencyTableV2Props): ReactElement {\n const renovateAPI = useApi(renovateApiRef);\n const alertAPI = useApi(alertApiRef);\n\n const tableClasses = useTableStyles();\n\n const [paginationModel, setPaginationModel] = useState({\n page: 0,\n pageSize: 100,\n });\n\n const [selectedFilters, setSelectedFilters] =\n useQueryParamState<Record<string, string[]>>('filters');\n\n const { value, loading, error } = useAsync(async () => {\n const response = await renovateAPI.dependenciesGet({\n query: {\n latestOnly: true,\n availableValues: true,\n ...paginationModel,\n ...selectedFilters,\n },\n });\n const { dependencies, availableValues } = await response.json();\n\n const totalCountHeader = response.headers.get('X-Total-Count');\n const totalCount = totalCountHeader\n ? Number.parseInt(totalCountHeader, 10)\n : dependencies.length;\n return {\n dependencies,\n availableValues,\n totalCount,\n };\n }, [paginationModel, selectedFilters]);\n\n if (error) {\n alertAPI.post({\n severity: 'error',\n message: error.message,\n });\n }\n\n const filterAbleColumns = useMemo(() => {\n const columns = props.columns ?? defaultColumns;\n const columnsWithOptions: FilterableColumnDef[] = columns.map(column => {\n const availableValues = value?.availableValues;\n if (!availableValues) {\n return column;\n }\n\n const field = column.field;\n if (field in availableValues) {\n return {\n ...column,\n filterOptions:\n availableValues[\n field as keyof DependenciesGet200ResponseAvailableValues\n ],\n };\n }\n return column;\n });\n\n return columnsWithOptions;\n }, [props.columns, value?.availableValues]);\n\n const columnVisibilityModel = useMemo(() => {\n const model: GridColumnVisibilityModel = {};\n for (const column of filterAbleColumns) {\n model[column.field] = !column.isHiddenOnInit;\n }\n return model;\n }, [filterAbleColumns]);\n\n return (\n <Box className={tableClasses.root}>\n <DataGrid\n // theming\n className={tableClasses.grid}\n // toolbar\n showToolbar\n // columns\n disableColumnMenu\n columns={filterAbleColumns}\n // rows\n rows={value?.dependencies ?? []}\n rowCount={value?.totalCount}\n loading={loading}\n // pagination\n pageSizeOptions={[]} // do not show the page size selector\n paginationMode=\"server\"\n paginationModel={paginationModel}\n onPaginationModelChange={model => setPaginationModel(model)}\n // init\n initialState={{\n columns: {\n columnVisibilityModel,\n },\n }}\n // sub component customization\n slots={{\n toolbar: CustomToolbar,\n }}\n slotProps={{\n toolbar: {\n filterAbleColumns,\n selectedFilters,\n onUpdateFilters: (filters: Record<string, string[]>) => {\n setSelectedFilters(filters);\n\n // Reset pagination when filters are updated\n setPaginationModel({\n page: 0,\n pageSize: paginationModel.pageSize,\n });\n },\n },\n }}\n />\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.esm.js","sources":["../../../src/components/DependencyTable/Filters.tsx"],"sourcesContent":["import Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { makeStyles } from '@mui/styles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport type { FilterableColumnDef } from './types';\n\nconst useFilterStyles = makeStyles(\n _theme => ({\n root: {\n height: '100%',\n width: '315px',\n display: 'flex',\n flexDirection: 'column',\n // marginRight: theme.spacing(3),\n marginRight: 15,\n },\n value: {\n fontWeight: 'bold',\n fontSize: 18,\n margin: 10,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n // height: theme.spacing(7.5),\n justifyContent: 'space-between',\n // borderBottom: `1px solid ${theme.palette.grey[500]}`,\n borderBottom: `1px solid `,\n },\n filters: {\n display: 'flex',\n flexDirection: 'column',\n margin: 10,\n '& > *': {\n // marginTop: theme.spacing(2),\n marginTop: 17,\n },\n },\n }),\n { name: 'BackstageTableFilters' },\n);\n\nexport type SelectedFilters = {\n [key: string]: string[];\n};\n\ntype Props = {\n filters: FilterableColumnDef[];\n selectedFilters?: SelectedFilters;\n onChangeFilters?: (arg: Record<string, string[]>) => void;\n};\n\nexport function Filters(props: Props) {\n const classes = useFilterStyles();\n\n const { selectedFilters } = props;\n const onChangeFilters = props.onChangeFilters || (() => {});\n\n const handleResetClick = () => {\n onChangeFilters({});\n };\n\n // As material table doesn't provide a way to add a column filter tab we will make our own filter logic\n return (\n <Box className={classes.root}>\n <Box className={classes.header}>\n <Box className={classes.value}>Filter</Box>\n <Button color=\"primary\" onClick={handleResetClick}>\n Clear All\n </Button>\n </Box>\n <Box className={classes.filters}>\n {props.filters.length &&\n props.filters.map(filter => (\n <Autocomplete\n multiple\n value={selectedFilters?.[filter.field] || []}\n key={filter.field}\n renderInput={params => (\n <TextField {...params} label={filter.headerName} />\n )}\n onChange={(_el, value) => {\n const newValue = {\n ...selectedFilters,\n [filter.field]: value,\n };\n onChangeFilters(newValue);\n }}\n options={filter.filterOptions || []}\n />\n ))}\n </Box>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAOA,MAAM,
|
|
1
|
+
{"version":3,"file":"Filters.esm.js","sources":["../../../src/components/DependencyTable/Filters.tsx"],"sourcesContent":["import Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport { makeStyles } from '@mui/styles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport type { FilterableColumnDef } from './types';\n\nconst useFilterStyles = makeStyles(\n _theme => ({\n root: {\n height: '100%',\n width: '315px',\n display: 'flex',\n flexDirection: 'column',\n // marginRight: theme.spacing(3),\n marginRight: 15,\n },\n value: {\n fontWeight: 'bold',\n fontSize: 18,\n margin: 10,\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n // height: theme.spacing(7.5),\n justifyContent: 'space-between',\n // borderBottom: `1px solid ${theme.palette.grey[500]}`,\n borderBottom: `1px solid `,\n },\n filters: {\n display: 'flex',\n flexDirection: 'column',\n margin: 10,\n '& > *': {\n // marginTop: theme.spacing(2),\n marginTop: 17,\n },\n },\n }),\n { name: 'BackstageTableFilters' },\n);\n\nexport type SelectedFilters = {\n [key: string]: string[];\n};\n\ntype Props = {\n filters: FilterableColumnDef[];\n selectedFilters?: SelectedFilters;\n onChangeFilters?: (arg: Record<string, string[]>) => void;\n};\n\nexport function Filters(props: Props) {\n const classes = useFilterStyles();\n\n const { selectedFilters } = props;\n const onChangeFilters = props.onChangeFilters || (() => {});\n\n const handleResetClick = () => {\n onChangeFilters({});\n };\n\n // As material table doesn't provide a way to add a column filter tab we will make our own filter logic\n return (\n <Box className={classes.root}>\n <Box className={classes.header}>\n <Box className={classes.value}>Filter</Box>\n <Button color=\"primary\" onClick={handleResetClick}>\n Clear All\n </Button>\n </Box>\n <Box className={classes.filters}>\n {props.filters.length &&\n props.filters.map(filter => (\n <Autocomplete\n multiple\n value={selectedFilters?.[filter.field] || []}\n key={filter.field}\n renderInput={params => (\n <TextField {...params} label={filter.headerName} />\n )}\n onChange={(_el, value) => {\n const newValue = {\n ...selectedFilters,\n [filter.field]: value,\n };\n onChangeFilters(newValue);\n }}\n options={filter.filterOptions || []}\n />\n ))}\n </Box>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAOA,MAAM,eAAA,GAAkB,UAAA;AAAA,EACtB,CAAA,MAAA,MAAW;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA;AAAA,MAEf,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,MAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA;AAAA,MAEZ,cAAA,EAAgB,eAAA;AAAA;AAAA,MAEhB,YAAA,EAAc,CAAA,UAAA;AAAA,KAChB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,MAAA,EAAQ,EAAA;AAAA,MACR,OAAA,EAAS;AAAA;AAAA,QAEP,SAAA,EAAW;AAAA;AACb;AACF,GACF,CAAA;AAAA,EACA,EAAE,MAAM,uBAAA;AACV,CAAA;AAYO,SAAS,QAAQ,KAAA,EAAc;AACpC,EAAA,MAAM,UAAU,eAAA,EAAgB;AAEhC,EAAA,MAAM,EAAE,iBAAgB,GAAI,KAAA;AAC5B,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,eAAA,KAAoB,MAAM;AAAA,EAAC,CAAA,CAAA;AAEzD,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,EACtB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACpC,MAAA,EAAA,EAAO,KAAA,EAAM,SAAA,EAAU,OAAA,EAAS,kBAAkB,QAAA,EAAA,WAAA,EAEnD;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACrB,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,MAAA,IACb,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,qBAChB,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,eAAA,GAAkB,MAAA,CAAO,KAAK,KAAK,EAAC;AAAA,QAE3C,WAAA,EAAa,4BACX,GAAA,CAAC,SAAA,EAAA,EAAW,GAAG,MAAA,EAAQ,KAAA,EAAO,OAAO,UAAA,EAAY,CAAA;AAAA,QAEnD,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,UAAA,MAAM,QAAA,GAAW;AAAA,YACf,GAAG,eAAA;AAAA,YACH,CAAC,MAAA,CAAO,KAAK,GAAG;AAAA,WAClB;AACA,UAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,OAAA,EAAS,MAAA,CAAO,aAAA,IAAiB;AAAC,OAAA;AAAA,MAX7B,MAAA,CAAO;AAAA,KAaf,CAAA,EACL;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultColumns.esm.js","sources":["../../../src/components/DependencyTable/defaultColumns.tsx"],"sourcesContent":["import { Link } from '@backstage/core-components';\nimport type { FilterableColumnDef } from './types';\n\nexport const defaultColumns: FilterableColumnDef[] = [\n {\n headerName: 'ID',\n field: 'id',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Run ID',\n field: 'runID',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Host',\n field: 'host',\n flex: 0.5,\n },\n {\n headerName: 'Repository',\n field: 'repository',\n flex: 1,\n },\n {\n headerName: 'Name',\n field: 'depName',\n flex: 1,\n renderCell: ({ row }) => {\n const sourceUrl = row.sourceUrl;\n const depName = row.depName;\n if (sourceUrl) {\n return <Link to={sourceUrl}>{depName}</Link>;\n }\n return depName;\n },\n },\n {\n headerName: 'Manager',\n field: 'manager',\n flex: 1,\n },\n {\n headerName: 'Datasource',\n field: 'datasource',\n flex: 1,\n },\n {\n headerName: 'Type',\n field: 'depType',\n flex: 1,\n },\n {\n headerName: 'Package File',\n field: 'packageFile',\n flex: 1,\n renderCell: ({ row }) => {\n const packageFileUrl = row.packageFileUrl;\n const packageFile = row.packageFile;\n if (packageFileUrl) {\n return <Link to={packageFileUrl}>{packageFile}</Link>;\n }\n return packageFile;\n },\n },\n {\n headerName: 'Current Value',\n field: 'currentValue',\n flex: 1,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Skip Reason',\n field: 'skipReason',\n flex: 1,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Registry URL',\n field: 'registryUrl',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Source URL',\n field: 'sourceUrl',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n renderCell: ({ row }) => {\n const sourceUrl = row.sourceUrl;\n if (sourceUrl) {\n return <Link to={sourceUrl}>{sourceUrl}</Link>;\n }\n return null;\n },\n },\n];\n"],"names":[],"mappings":";;;AAGO,MAAM,
|
|
1
|
+
{"version":3,"file":"defaultColumns.esm.js","sources":["../../../src/components/DependencyTable/defaultColumns.tsx"],"sourcesContent":["import { Link } from '@backstage/core-components';\nimport type { FilterableColumnDef } from './types';\n\nexport const defaultColumns: FilterableColumnDef[] = [\n {\n headerName: 'ID',\n field: 'id',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Run ID',\n field: 'runID',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Host',\n field: 'host',\n flex: 0.5,\n },\n {\n headerName: 'Repository',\n field: 'repository',\n flex: 1,\n },\n {\n headerName: 'Name',\n field: 'depName',\n flex: 1,\n renderCell: ({ row }) => {\n const sourceUrl = row.sourceUrl;\n const depName = row.depName;\n if (sourceUrl) {\n return <Link to={sourceUrl}>{depName}</Link>;\n }\n return depName;\n },\n },\n {\n headerName: 'Manager',\n field: 'manager',\n flex: 1,\n },\n {\n headerName: 'Datasource',\n field: 'datasource',\n flex: 1,\n },\n {\n headerName: 'Type',\n field: 'depType',\n flex: 1,\n },\n {\n headerName: 'Package File',\n field: 'packageFile',\n flex: 1,\n renderCell: ({ row }) => {\n const packageFileUrl = row.packageFileUrl;\n const packageFile = row.packageFile;\n if (packageFileUrl) {\n return <Link to={packageFileUrl}>{packageFile}</Link>;\n }\n return packageFile;\n },\n },\n {\n headerName: 'Current Value',\n field: 'currentValue',\n flex: 1,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Skip Reason',\n field: 'skipReason',\n flex: 1,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Registry URL',\n field: 'registryUrl',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n },\n {\n headerName: 'Source URL',\n field: 'sourceUrl',\n isHiddenOnInit: true,\n // no available data endpoint for this field\n isFilterable: false,\n renderCell: ({ row }) => {\n const sourceUrl = row.sourceUrl;\n if (sourceUrl) {\n return <Link to={sourceUrl}>{sourceUrl}</Link>;\n }\n return null;\n },\n },\n];\n"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { getEntitySourceLocation } from '@backstage/catalog-model';
|
|
|
4
4
|
import { useApi } from '@backstage/core-plugin-api';
|
|
5
5
|
import useAsync from 'react-use/lib/useAsync';
|
|
6
6
|
import { getTargetURL } from '@secustor/backstage-plugin-renovate-common';
|
|
7
|
-
import {
|
|
7
|
+
import { Progress, ResponseErrorPanel, Table, Link } from '@backstage/core-components';
|
|
8
8
|
import is from '@sindresorhus/is';
|
|
9
9
|
import { scmIntegrationsApiRef } from '@backstage/integration-react';
|
|
10
10
|
import { isError } from '@backstage/errors';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityRenovateContent.esm.js","sources":["../../../src/components/EntityRenovateContent/EntityRenovateContent.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { getEntitySourceLocation } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { getTargetURL } from '@secustor/backstage-plugin-renovate-common';\nimport {\n Link,\n Progress,\n ResponseErrorPanel,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport is from '@sindresorhus/is';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { isError } from '@backstage/errors';\nimport { getBiggestUpdate } from '../../tools';\nimport { DependencyTableProps, DependencyTableRow } from './types';\nimport { RenovateEmptyState } from '../RenovateReportEmptyState/RenovateEmptyState';\nimport { renovateApiRef } from '../../api';\n\nexport const DependencyTable = (props: DependencyTableProps) => {\n const columns: TableColumn[] = [\n { title: 'ID', field: 'id', hidden: true },\n { title: 'Package file', field: 'packageFile' },\n { title: 'Name', field: 'depName' },\n { title: 'Manager', field: 'manager' },\n { title: 'Type', field: 'depType' },\n { title: 'Current Value', field: 'currentValue' },\n { title: 'Current Version', field: 'currentVersion' },\n { title: 'Available Version', field: 'newVersion' },\n ];\n\n const data = useData(props);\n\n return (\n <Table\n title=\"Dependencies\"\n options={{ search: true, paging: false }}\n columns={columns}\n data={data}\n />\n );\n};\n\nexport const EntityRenovateContent = () => {\n const { entity } = useEntity();\n const renovateAPI = useApi(renovateApiRef);\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n\n const { value, loading, error } = useAsync(\n () => renovateAPI.getCurrentReport(entity),\n [entity],\n );\n\n if (error) {\n // rethrow error so it is captured by the error panel\n throw error;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (is.nullOrUndefined(value)) {\n return <RenovateEmptyState />;\n }\n\n try {\n const { target } = getEntitySourceLocation(entity);\n const parsed = getTargetURL(target);\n const baseURL = scmIntegrationsApi.resolveUrl({\n url: parsed.filepath,\n base: target,\n });\n\n return (\n <DependencyTable\n packageFiles={value.report.packageFiles}\n filter={{ path: parsed.filepath }}\n baseURL={baseURL}\n />\n );\n } catch (e) {\n return (\n <ResponseErrorPanel\n error={isError(e) ? e : new Error(JSON.stringify(e))}\n />\n );\n }\n};\n\nfunction useData({\n packageFiles,\n filter,\n baseURL,\n}: DependencyTableProps): DependencyTableRow[] {\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n\n const data: DependencyTableRow[] = [];\n let id = 0;\n for (const [manager, packageFilesList] of Object.entries(packageFiles)) {\n for (const packageFileObject of packageFilesList) {\n // filter packages which are not in the same folder or in the tree underneath\n const pathFilter = filter?.path;\n if (pathFilter) {\n if (!packageFileObject.packageFile.startsWith(pathFilter)) {\n continue;\n }\n }\n for (const dependency of packageFileObject.deps) {\n const file = `/${packageFileObject.packageFile}`;\n\n const biggestUpdate = getBiggestUpdate(dependency.updates ?? []);\n\n const massagedDepName =\n dependency.depName ?? dependency.registryUrl ?? '';\n data.push({\n id,\n depName: massagedDepName,\n manager,\n packageFile: baseURL ? (\n <Link\n to={scmIntegrationsApi.resolveUrl({ base: baseURL, url: file })}\n >\n {file}\n </Link>\n ) : (\n file\n ),\n depType: dependency.depType,\n currentValue: dependency.currentValue ?? dependency.skipReason ?? '',\n currentVersion: dependency.currentVersion,\n newVersion: biggestUpdate?.newVersion ?? biggestUpdate?.newValue,\n });\n id++;\n }\n }\n }\n return data;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"EntityRenovateContent.esm.js","sources":["../../../src/components/EntityRenovateContent/EntityRenovateContent.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport { getEntitySourceLocation } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { getTargetURL } from '@secustor/backstage-plugin-renovate-common';\nimport {\n Link,\n Progress,\n ResponseErrorPanel,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport is from '@sindresorhus/is';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { isError } from '@backstage/errors';\nimport { getBiggestUpdate } from '../../tools';\nimport { DependencyTableProps, DependencyTableRow } from './types';\nimport { RenovateEmptyState } from '../RenovateReportEmptyState/RenovateEmptyState';\nimport { renovateApiRef } from '../../api';\n\nexport const DependencyTable = (props: DependencyTableProps) => {\n const columns: TableColumn[] = [\n { title: 'ID', field: 'id', hidden: true },\n { title: 'Package file', field: 'packageFile' },\n { title: 'Name', field: 'depName' },\n { title: 'Manager', field: 'manager' },\n { title: 'Type', field: 'depType' },\n { title: 'Current Value', field: 'currentValue' },\n { title: 'Current Version', field: 'currentVersion' },\n { title: 'Available Version', field: 'newVersion' },\n ];\n\n const data = useData(props);\n\n return (\n <Table\n title=\"Dependencies\"\n options={{ search: true, paging: false }}\n columns={columns}\n data={data}\n />\n );\n};\n\nexport const EntityRenovateContent = () => {\n const { entity } = useEntity();\n const renovateAPI = useApi(renovateApiRef);\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n\n const { value, loading, error } = useAsync(\n () => renovateAPI.getCurrentReport(entity),\n [entity],\n );\n\n if (error) {\n // rethrow error so it is captured by the error panel\n throw error;\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (is.nullOrUndefined(value)) {\n return <RenovateEmptyState />;\n }\n\n try {\n const { target } = getEntitySourceLocation(entity);\n const parsed = getTargetURL(target);\n const baseURL = scmIntegrationsApi.resolveUrl({\n url: parsed.filepath,\n base: target,\n });\n\n return (\n <DependencyTable\n packageFiles={value.report.packageFiles}\n filter={{ path: parsed.filepath }}\n baseURL={baseURL}\n />\n );\n } catch (e) {\n return (\n <ResponseErrorPanel\n error={isError(e) ? e : new Error(JSON.stringify(e))}\n />\n );\n }\n};\n\nfunction useData({\n packageFiles,\n filter,\n baseURL,\n}: DependencyTableProps): DependencyTableRow[] {\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n\n const data: DependencyTableRow[] = [];\n let id = 0;\n for (const [manager, packageFilesList] of Object.entries(packageFiles)) {\n for (const packageFileObject of packageFilesList) {\n // filter packages which are not in the same folder or in the tree underneath\n const pathFilter = filter?.path;\n if (pathFilter) {\n if (!packageFileObject.packageFile.startsWith(pathFilter)) {\n continue;\n }\n }\n for (const dependency of packageFileObject.deps) {\n const file = `/${packageFileObject.packageFile}`;\n\n const biggestUpdate = getBiggestUpdate(dependency.updates ?? []);\n\n const massagedDepName =\n dependency.depName ?? dependency.registryUrl ?? '';\n data.push({\n id,\n depName: massagedDepName,\n manager,\n packageFile: baseURL ? (\n <Link\n to={scmIntegrationsApi.resolveUrl({ base: baseURL, url: file })}\n >\n {file}\n </Link>\n ) : (\n file\n ),\n depType: dependency.depType,\n currentValue: dependency.currentValue ?? dependency.skipReason ?? '',\n currentVersion: dependency.currentVersion,\n newVersion: biggestUpdate?.newVersion ?? biggestUpdate?.newValue,\n });\n id++;\n }\n }\n }\n return data;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenovateDefaultOverview.esm.js","sources":["../../../src/components/RenovateDefaultOverview/RenovateDefaultOverview.tsx"],"sourcesContent":["import { ReactElement } from 'react';\nimport Grid from '@mui/material/Grid';\nimport {\n Header,\n Page,\n Content,\n ContentHeader,\n HeaderLabel,\n SupportButton,\n} from '@backstage/core-components';\nimport { ReportFetchComponent } from '../ReportFetchComponent';\nimport { RenovateStarter } from '../RenovateStarter';\nimport { DependencyTable } from '../DependencyTable';\n\nexport interface RenovateDefaultOverviewProps {\n showStarter?: boolean;\n}\n\nexport function RenovateDefaultOverview(\n props?: RenovateDefaultOverviewProps,\n): ReactElement {\n return (\n <Page themeId=\"tool\">\n <Header title=\"Renovate\" subtitle=\"\">\n <HeaderLabel label=\"Owner\" value=\"Developer Experience\" />\n <HeaderLabel label=\"Lifecycle\" value=\"Alpha\" />\n </Header>\n <Content>\n <ContentHeader title=\"Dependencies\">\n <SupportButton>Renovate support</SupportButton>\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <DependencyTable />\n {props?.showStarter && <RenovateStarter />}\n <Grid>\n <ReportFetchComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAkBO,SAAS,wBACd,
|
|
1
|
+
{"version":3,"file":"RenovateDefaultOverview.esm.js","sources":["../../../src/components/RenovateDefaultOverview/RenovateDefaultOverview.tsx"],"sourcesContent":["import { ReactElement } from 'react';\nimport Grid from '@mui/material/Grid';\nimport {\n Header,\n Page,\n Content,\n ContentHeader,\n HeaderLabel,\n SupportButton,\n} from '@backstage/core-components';\nimport { ReportFetchComponent } from '../ReportFetchComponent';\nimport { RenovateStarter } from '../RenovateStarter';\nimport { DependencyTable } from '../DependencyTable';\n\nexport interface RenovateDefaultOverviewProps {\n showStarter?: boolean;\n}\n\nexport function RenovateDefaultOverview(\n props?: RenovateDefaultOverviewProps,\n): ReactElement {\n return (\n <Page themeId=\"tool\">\n <Header title=\"Renovate\" subtitle=\"\">\n <HeaderLabel label=\"Owner\" value=\"Developer Experience\" />\n <HeaderLabel label=\"Lifecycle\" value=\"Alpha\" />\n </Header>\n <Content>\n <ContentHeader title=\"Dependencies\">\n <SupportButton>Renovate support</SupportButton>\n </ContentHeader>\n <Grid container spacing={3} direction=\"column\">\n <DependencyTable />\n {props?.showStarter && <RenovateStarter />}\n <Grid>\n <ReportFetchComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAkBO,SAAS,wBACd,KAAA,EACc;AACd,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAM,UAAA,EAAW,QAAA,EAAS,EAAA,EAChC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAM,sBAAA,EAAuB,CAAA;AAAA,sBACxD,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,WAAA,EAAY,OAAM,OAAA,EAAQ;AAAA,KAAA,EAC/C,CAAA;AAAA,yBACC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,iBAAc,KAAA,EAAM,cAAA,EACnB,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,8BAAgB,CAAA,EACjC,CAAA;AAAA,2BACC,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,OAAA,EAAS,CAAA,EAAG,WAAU,QAAA,EACpC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,QAChB,KAAA,EAAO,WAAA,oBAAe,GAAA,CAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,wBACxC,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,oBAAA,EAAA,EAAqB,CAAA,EACxB;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenovateEmptyState.esm.js","sources":["../../../src/components/RenovateReportEmptyState/RenovateEmptyState.tsx"],"sourcesContent":["import { EmptyState } from '@backstage/core-components';\nimport { StartRenovateButton } from '../StartRenovateButton/StartRenovateButton';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nexport function RenovateEmptyState() {\n const { entity } = useEntity();\n return (\n <EmptyState\n title=\"No Dependency report found\"\n missing=\"data\"\n description=\"It seems like there has not one been any report generated yet.\"\n action={<StartRenovateButton target={entity} title=\"Scan this entity\" />}\n />\n );\n}\n"],"names":[],"mappings":";;;;;AAIO,SAAS,
|
|
1
|
+
{"version":3,"file":"RenovateEmptyState.esm.js","sources":["../../../src/components/RenovateReportEmptyState/RenovateEmptyState.tsx"],"sourcesContent":["import { EmptyState } from '@backstage/core-components';\nimport { StartRenovateButton } from '../StartRenovateButton/StartRenovateButton';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nexport function RenovateEmptyState() {\n const { entity } = useEntity();\n return (\n <EmptyState\n title=\"No Dependency report found\"\n missing=\"data\"\n description=\"It seems like there has not one been any report generated yet.\"\n action={<StartRenovateButton target={entity} title=\"Scan this entity\" />}\n />\n );\n}\n"],"names":[],"mappings":";;;;;AAIO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAY,gEAAA;AAAA,MACZ,wBAAQ,GAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,OAAM,kBAAA,EAAmB;AAAA;AAAA,GACxE;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenovateStarter.esm.js","sources":["../../../src/components/RenovateStarter/RenovateStarter.tsx"],"sourcesContent":["import { InfoCard } from '@backstage/core-components';\nimport TextField from '@mui/material/TextField';\nimport { useState } from 'react';\nimport { StartRenovateButton } from '../StartRenovateButton/StartRenovateButton';\n\nexport const RenovateStarter = () => {\n const [repoURL, setRepoURL] = useState<string>('');\n const [inputError, setInputError] = useState<boolean>(false);\n\n return (\n <InfoCard title=\"Run Renovate\">\n <TextField\n fullWidth\n error={inputError}\n helperText={inputError ? 'Add a source url to run Renovate' : ''}\n id=\"repo-url\"\n label=\"RepoURL\"\n onChange={e => setRepoURL(e.target.value)}\n margin=\"normal\"\n />\n <StartRenovateButton\n target={repoURL}\n onFailure={() => setInputError(true)}\n onSuccess={() => setInputError(false)}\n />\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAiB,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAkB,KAAK,CAAA;AAE3D,
|
|
1
|
+
{"version":3,"file":"RenovateStarter.esm.js","sources":["../../../src/components/RenovateStarter/RenovateStarter.tsx"],"sourcesContent":["import { InfoCard } from '@backstage/core-components';\nimport TextField from '@mui/material/TextField';\nimport { useState } from 'react';\nimport { StartRenovateButton } from '../StartRenovateButton/StartRenovateButton';\n\nexport const RenovateStarter = () => {\n const [repoURL, setRepoURL] = useState<string>('');\n const [inputError, setInputError] = useState<boolean>(false);\n\n return (\n <InfoCard title=\"Run Renovate\">\n <TextField\n fullWidth\n error={inputError}\n helperText={inputError ? 'Add a source url to run Renovate' : ''}\n id=\"repo-url\"\n label=\"RepoURL\"\n onChange={e => setRepoURL(e.target.value)}\n margin=\"normal\"\n />\n <StartRenovateButton\n target={repoURL}\n onFailure={() => setInputError(true)}\n onSuccess={() => setInputError(false)}\n />\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAiB,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAkB,KAAK,CAAA;AAE3D,EAAA,uBACE,IAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,cAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,UAAA;AAAA,QACP,UAAA,EAAY,aAAa,kCAAA,GAAqC,EAAA;AAAA,QAC9D,EAAA,EAAG,UAAA;AAAA,QACH,KAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,MAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBACA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,QACnC,SAAA,EAAW,MAAM,aAAA,CAAc,KAAK;AAAA;AAAA;AACtC,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InspectReportDialog.esm.js","sources":["../../../src/components/ReportFetchComponent/InspectReportDialog.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\n\nimport { JsonViewer } from '@textea/json-viewer';\n\nexport interface InspectReportDialogProps {\n open: boolean;\n report: unknown;\n onClose: () => void;\n}\n\nexport function InspectReportDialog(props: InspectReportDialogProps) {\n return (\n <Dialog open={props.open} onClose={props.onClose} fullWidth maxWidth=\"xl\">\n <DialogTitle id=\"report-inspector-dialog-title\">\n Report Inspector\n </DialogTitle>\n <DialogContent>\n <JsonViewer theme=\"auto\" value={props.report} />\n </DialogContent>\n <DialogActions>\n <Button onClick={props.onClose} color=\"primary\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAcO,SAAS,oBAAoB,
|
|
1
|
+
{"version":3,"file":"InspectReportDialog.esm.js","sources":["../../../src/components/ReportFetchComponent/InspectReportDialog.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\n\nimport { JsonViewer } from '@textea/json-viewer';\n\nexport interface InspectReportDialogProps {\n open: boolean;\n report: unknown;\n onClose: () => void;\n}\n\nexport function InspectReportDialog(props: InspectReportDialogProps) {\n return (\n <Dialog open={props.open} onClose={props.onClose} fullWidth maxWidth=\"xl\">\n <DialogTitle id=\"report-inspector-dialog-title\">\n Report Inspector\n </DialogTitle>\n <DialogContent>\n <JsonViewer theme=\"auto\" value={props.report} />\n </DialogContent>\n <DialogActions>\n <Button onClick={props.onClose} color=\"primary\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAcO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,SAAA,EAAS,IAAA,EAAC,QAAA,EAAS,IAAA,EACnE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,EAAA,EAAG,+BAAA,EAAgC,QAAA,EAAA,kBAAA,EAEhD,CAAA;AAAA,oBACA,GAAA,CAAC,iBACC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAM,MAAA,EAAO,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA,EAChD,CAAA;AAAA,oBACA,GAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,OAAA,EAEhD,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportFetchComponent.esm.js","sources":["../../../src/components/ReportFetchComponent/ReportFetchComponent.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport NotesIcon from '@mui/icons-material/Notes';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport useAsync from 'react-use/lib/useAsync';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport {\n getTargetRepoSafe,\n RepositoryReportResponse,\n RepositoryReportResponseElement,\n} from '@secustor/backstage-plugin-renovate-common';\nimport is from '@sindresorhus/is';\nimport { InspectReportDialog } from './InspectReportDialog';\n\ntype DenseTableProps = {\n reports: RepositoryReportResponse;\n paginate?: boolean;\n};\n\ninterface RowDataEntry {\n id: string;\n host: string;\n repository: string;\n timestamp: Date;\n noPRs: number;\n noBranches: number;\n noUpdates: number;\n noDeps: number;\n report: RepositoryReportResponseElement;\n}\n\nexport function ReportTable(options: DenseTableProps) {\n const { reports } = options;\n const columns: TableColumn<RowDataEntry>[] = [\n {\n title: 'timestamp',\n field: 'timestamp',\n defaultSort: 'desc',\n type: 'datetime',\n },\n { title: 'Host', field: 'host' },\n { title: 'Repository', field: 'repository' },\n {\n title: 'Total Libyears',\n field: 'libyears',\n render: rowData =>\n rowData.report.report.libYears?.totalLibYears?.toFixed(2),\n align: 'right',\n },\n { title: 'Number of dependencies', field: 'noDeps' },\n { title: 'Number of outdated dependencies', field: 'outdatedDeps' },\n { title: 'Number of PRs', field: 'noPRs' },\n { title: 'Number of branches', field: 'noBranches' },\n { title: 'Number of updates', field: 'noUpdates' },\n ];\n\n const data = reports.flatMap(\n report => {\n const packageFiles = Object.values(report.report.packageFiles).flat();\n const deps = packageFiles.flatMap(packageFile => packageFile.deps);\n return {\n id: report.runID,\n host: report.host,\n repository: report.repository,\n libyears: report.report.libYears?.totalLibYears,\n timestamp: report.timestamp,\n noPRs: report.report.branches.filter(\n branch => !is.nullOrUndefined(branch.prNo),\n ).length,\n noBranches: report.report.branches.length,\n noUpdates: report.report.branches.flatMap(branch => branch.upgrades)\n .length,\n outdatedDeps: report.report.libYears?.outdatedDepsCount,\n noDeps: report.report.libYears?.totalDepsCount ?? deps.length,\n report,\n };\n },\n [reports],\n );\n\n const [inspectionDialogData, setInspectionDialogData] =\n useState<RepositoryReportResponseElement | null>(null);\n const renovateAPI = useApi(renovateApiRef);\n const alertAPI = useApi(alertApiRef);\n\n return (\n <>\n <Table\n title=\"Report List\"\n options={{\n search: true,\n paging: options.paginate ?? true,\n actionsColumnIndex: -1,\n }}\n columns={columns}\n data={data}\n actions={[\n {\n icon: () => <NotesIcon />,\n tooltip: 'Open raw report',\n onClick: (_event, rowData) => {\n const report = is.array(rowData)\n ? rowData[0].report\n : rowData.report;\n setInspectionDialogData(report);\n },\n },\n rowData => {\n return {\n icon: () => <RefreshIcon />,\n tooltip: 'Rescan',\n onClick: async _event => {\n const target = getTargetRepoSafe(rowData);\n if (!target) {\n return;\n }\n const result = await renovateAPI.runsPost({\n body: {\n target: `${target.host}/${target.repository}`,\n },\n });\n const test = await result.json();\n if (result.ok) {\n alertAPI.post({\n severity: 'success',\n display: 'transient',\n message: `Started job ${test.taskID}`,\n });\n return;\n }\n\n alertAPI.post({\n severity: 'error',\n message: result.statusText,\n });\n },\n };\n },\n ]}\n />\n <InspectReportDialog\n open={!!inspectionDialogData}\n report={inspectionDialogData}\n onClose={() => setInspectionDialogData(null)}\n />\n </>\n );\n}\n\nexport const ReportFetchComponent = () => {\n const renovateAPI = useApi(renovateApiRef);\n const { value, loading, error } = useAsync(\n () => renovateAPI.getReports(),\n [],\n );\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return <ReportTable reports={value ?? []} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAqCO,SAAS,YAAY,
|
|
1
|
+
{"version":3,"file":"ReportFetchComponent.esm.js","sources":["../../../src/components/ReportFetchComponent/ReportFetchComponent.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport NotesIcon from '@mui/icons-material/Notes';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport useAsync from 'react-use/lib/useAsync';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport {\n getTargetRepoSafe,\n RepositoryReportResponse,\n RepositoryReportResponseElement,\n} from '@secustor/backstage-plugin-renovate-common';\nimport is from '@sindresorhus/is';\nimport { InspectReportDialog } from './InspectReportDialog';\n\ntype DenseTableProps = {\n reports: RepositoryReportResponse;\n paginate?: boolean;\n};\n\ninterface RowDataEntry {\n id: string;\n host: string;\n repository: string;\n timestamp: Date;\n noPRs: number;\n noBranches: number;\n noUpdates: number;\n noDeps: number;\n report: RepositoryReportResponseElement;\n}\n\nexport function ReportTable(options: DenseTableProps) {\n const { reports } = options;\n const columns: TableColumn<RowDataEntry>[] = [\n {\n title: 'timestamp',\n field: 'timestamp',\n defaultSort: 'desc',\n type: 'datetime',\n },\n { title: 'Host', field: 'host' },\n { title: 'Repository', field: 'repository' },\n {\n title: 'Total Libyears',\n field: 'libyears',\n render: rowData =>\n rowData.report.report.libYears?.totalLibYears?.toFixed(2),\n align: 'right',\n },\n { title: 'Number of dependencies', field: 'noDeps' },\n { title: 'Number of outdated dependencies', field: 'outdatedDeps' },\n { title: 'Number of PRs', field: 'noPRs' },\n { title: 'Number of branches', field: 'noBranches' },\n { title: 'Number of updates', field: 'noUpdates' },\n ];\n\n const data = reports.flatMap(\n report => {\n const packageFiles = Object.values(report.report.packageFiles).flat();\n const deps = packageFiles.flatMap(packageFile => packageFile.deps);\n return {\n id: report.runID,\n host: report.host,\n repository: report.repository,\n libyears: report.report.libYears?.totalLibYears,\n timestamp: report.timestamp,\n noPRs: report.report.branches.filter(\n branch => !is.nullOrUndefined(branch.prNo),\n ).length,\n noBranches: report.report.branches.length,\n noUpdates: report.report.branches.flatMap(branch => branch.upgrades)\n .length,\n outdatedDeps: report.report.libYears?.outdatedDepsCount,\n noDeps: report.report.libYears?.totalDepsCount ?? deps.length,\n report,\n };\n },\n [reports],\n );\n\n const [inspectionDialogData, setInspectionDialogData] =\n useState<RepositoryReportResponseElement | null>(null);\n const renovateAPI = useApi(renovateApiRef);\n const alertAPI = useApi(alertApiRef);\n\n return (\n <>\n <Table\n title=\"Report List\"\n options={{\n search: true,\n paging: options.paginate ?? true,\n actionsColumnIndex: -1,\n }}\n columns={columns}\n data={data}\n actions={[\n {\n icon: () => <NotesIcon />,\n tooltip: 'Open raw report',\n onClick: (_event, rowData) => {\n const report = is.array(rowData)\n ? rowData[0].report\n : rowData.report;\n setInspectionDialogData(report);\n },\n },\n rowData => {\n return {\n icon: () => <RefreshIcon />,\n tooltip: 'Rescan',\n onClick: async _event => {\n const target = getTargetRepoSafe(rowData);\n if (!target) {\n return;\n }\n const result = await renovateAPI.runsPost({\n body: {\n target: `${target.host}/${target.repository}`,\n },\n });\n const test = await result.json();\n if (result.ok) {\n alertAPI.post({\n severity: 'success',\n display: 'transient',\n message: `Started job ${test.taskID}`,\n });\n return;\n }\n\n alertAPI.post({\n severity: 'error',\n message: result.statusText,\n });\n },\n };\n },\n ]}\n />\n <InspectReportDialog\n open={!!inspectionDialogData}\n report={inspectionDialogData}\n onClose={() => setInspectionDialogData(null)}\n />\n </>\n );\n}\n\nexport const ReportFetchComponent = () => {\n const renovateAPI = useApi(renovateApiRef);\n const { value, loading, error } = useAsync(\n () => renovateAPI.getReports(),\n [],\n );\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return <ReportTable reports={value ?? []} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAqCO,SAAS,YAAY,OAAA,EAA0B;AACpD,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,OAAA,GAAuC;AAAA,IAC3C;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,KAAA,EAAO,WAAA;AAAA,MACP,WAAA,EAAa,MAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,IAC/B,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAa;AAAA,IAC3C;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ,aACN,OAAA,CAAQ,MAAA,CAAO,OAAO,QAAA,EAAU,aAAA,EAAe,QAAQ,CAAC,CAAA;AAAA,MAC1D,KAAA,EAAO;AAAA,KACT;AAAA,IACA,EAAE,KAAA,EAAO,wBAAA,EAA0B,KAAA,EAAO,QAAA,EAAS;AAAA,IACnD,EAAE,KAAA,EAAO,iCAAA,EAAmC,KAAA,EAAO,cAAA,EAAe;AAAA,IAClE,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,OAAA,EAAQ;AAAA,IACzC,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,YAAA,EAAa;AAAA,IACnD,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,WAAA;AAAY,GACnD;AAEA,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AAAA,IACnB,CAAA,MAAA,KAAU;AACR,MAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,OAAO,MAAA,CAAO,YAAY,EAAE,IAAA,EAAK;AACpE,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,CAAA,WAAA,KAAe,YAAY,IAAI,CAAA;AACjE,MAAA,OAAO;AAAA,QACL,IAAI,MAAA,CAAO,KAAA;AAAA,QACX,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,aAAA;AAAA,QAClC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA;AAAA,UAC5B,CAAA,MAAA,KAAU,CAAC,EAAA,CAAG,eAAA,CAAgB,OAAO,IAAI;AAAA,SAC3C,CAAE,MAAA;AAAA,QACF,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA;AAAA,QACnC,SAAA,EAAW,OAAO,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,MAAA,KAAU,MAAA,CAAO,QAAQ,CAAA,CAChE,MAAA;AAAA,QACH,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,iBAAA;AAAA,QACtC,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,kBAAkB,IAAA,CAAK,MAAA;AAAA,QACvD;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAClD,SAAiD,IAAI,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AAEnC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,MAAA,EAAQ,QAAQ,QAAA,IAAY,IAAA;AAAA,UAC5B,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,sBAAM,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA;AAAA,YACvB,OAAA,EAAS,iBAAA;AAAA,YACT,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAA,KAAY;AAC5B,cAAA,MAAM,MAAA,GAAS,GAAG,KAAA,CAAM,OAAO,IAC3B,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,GACX,OAAA,CAAQ,MAAA;AACZ,cAAA,uBAAA,CAAwB,MAAM,CAAA;AAAA,YAChC;AAAA,WACF;AAAA,UACA,CAAA,OAAA,KAAW;AACT,YAAA,OAAO;AAAA,cACL,IAAA,EAAM,sBAAM,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,cACzB,OAAA,EAAS,QAAA;AAAA,cACT,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,gBAAA,MAAM,MAAA,GAAS,kBAAkB,OAAO,CAAA;AACxC,gBAAA,IAAI,CAAC,MAAA,EAAQ;AACX,kBAAA;AAAA,gBACF;AACA,gBAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,QAAA,CAAS;AAAA,kBACxC,IAAA,EAAM;AAAA,oBACJ,QAAQ,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA;AAAA;AAC7C,iBACD,CAAA;AACD,gBAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAC/B,gBAAA,IAAI,OAAO,EAAA,EAAI;AACb,kBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,oBACZ,QAAA,EAAU,SAAA;AAAA,oBACV,OAAA,EAAS,WAAA;AAAA,oBACT,OAAA,EAAS,CAAA,YAAA,EAAe,IAAA,CAAK,MAAM,CAAA;AAAA,mBACpC,CAAA;AACD,kBAAA;AAAA,gBACF;AAEA,gBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,kBACZ,QAAA,EAAU,OAAA;AAAA,kBACV,SAAS,MAAA,CAAO;AAAA,iBACjB,CAAA;AAAA,cACH;AAAA,aACF;AAAA,UACF;AAAA;AACF;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAC,CAAC,oBAAA;AAAA,QACR,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAA,EAAS,MAAM,uBAAA,CAAwB,IAAI;AAAA;AAAA;AAC7C,GAAA,EACF,CAAA;AAEJ;AAEO,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AACzC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,QAAA;AAAA,IAChC,MAAM,YAAY,UAAA,EAAW;AAAA,IAC7B;AAAC,GACH;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO,GAAA,CAAC,sBAAmB,KAAA,EAAc,CAAA;AAAA,EAC3C;AAEA,EAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAS,KAAA,IAAS,EAAC,EAAG,CAAA;AAC5C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartRenovateButton.esm.js","sources":["../../../src/components/StartRenovateButton/StartRenovateButton.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport CardActions from '@mui/material/CardActions';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport PlayArrowIcon from '@mui/icons-material/PlayArrow';\nimport is from '@sindresorhus/is';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\n\nexport interface StartRenovateButtonProps {\n target: string | Entity;\n title?: string;\n onFailure?: () => void;\n onSuccess?: () => void;\n}\n\nexport function StartRenovateButton(props: StartRenovateButtonProps) {\n const { onFailure, onSuccess, target, title } = props;\n\n const alertAPI = useApi(alertApiRef);\n\n const massagedTarget = is.string(target)\n ? target\n : stringifyEntityRef(target);\n const renovateAPI = useApi(renovateApiRef);\n\n const [loading, setLoading] = useState<boolean>(false);\n\n const triggerRenovateRun = async () => {\n if (is.emptyString(massagedTarget)) {\n if (onFailure) {\n onFailure();\n }\n return;\n }\n\n if (onSuccess) {\n onSuccess();\n }\n setLoading(true);\n\n const result = await renovateAPI.runsPost({\n body: {\n target: massagedTarget,\n },\n });\n const body = await result.json();\n\n setLoading(false);\n\n if (result.ok) {\n alertAPI.post({\n severity: 'success',\n display: 'transient',\n message: `Started job ${body.taskID}`,\n });\n return;\n }\n\n alertAPI.post({\n severity: 'error',\n message: result.statusText,\n });\n };\n\n return (\n <CardActions>\n {loading && <CircularProgress />}\n <Button\n id=\"run-renovate\"\n variant=\"contained\"\n endIcon={<PlayArrowIcon />}\n onClick={triggerRenovateRun}\n disabled={loading}\n >\n {title ?? 'Run Renovate'}\n </Button>\n </CardActions>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAiBO,SAAS,oBAAoB,
|
|
1
|
+
{"version":3,"file":"StartRenovateButton.esm.js","sources":["../../../src/components/StartRenovateButton/StartRenovateButton.tsx"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport CardActions from '@mui/material/CardActions';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport PlayArrowIcon from '@mui/icons-material/PlayArrow';\nimport is from '@sindresorhus/is';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { renovateApiRef } from '../../api';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\n\nexport interface StartRenovateButtonProps {\n target: string | Entity;\n title?: string;\n onFailure?: () => void;\n onSuccess?: () => void;\n}\n\nexport function StartRenovateButton(props: StartRenovateButtonProps) {\n const { onFailure, onSuccess, target, title } = props;\n\n const alertAPI = useApi(alertApiRef);\n\n const massagedTarget = is.string(target)\n ? target\n : stringifyEntityRef(target);\n const renovateAPI = useApi(renovateApiRef);\n\n const [loading, setLoading] = useState<boolean>(false);\n\n const triggerRenovateRun = async () => {\n if (is.emptyString(massagedTarget)) {\n if (onFailure) {\n onFailure();\n }\n return;\n }\n\n if (onSuccess) {\n onSuccess();\n }\n setLoading(true);\n\n const result = await renovateAPI.runsPost({\n body: {\n target: massagedTarget,\n },\n });\n const body = await result.json();\n\n setLoading(false);\n\n if (result.ok) {\n alertAPI.post({\n severity: 'success',\n display: 'transient',\n message: `Started job ${body.taskID}`,\n });\n return;\n }\n\n alertAPI.post({\n severity: 'error',\n message: result.statusText,\n });\n };\n\n return (\n <CardActions>\n {loading && <CircularProgress />}\n <Button\n id=\"run-renovate\"\n variant=\"contained\"\n endIcon={<PlayArrowIcon />}\n onClick={triggerRenovateRun}\n disabled={loading}\n >\n {title ?? 'Run Renovate'}\n </Button>\n </CardActions>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAiBO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,OAAM,GAAI,KAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AAEnC,EAAA,MAAM,iBAAiB,EAAA,CAAG,MAAA,CAAO,MAAM,CAAA,GACnC,MAAA,GACA,mBAAmB,MAAM,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AAEzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAkB,KAAK,CAAA;AAErD,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,IAAI,EAAA,CAAG,WAAA,CAAY,cAAc,CAAA,EAAG;AAClC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,EAAU;AAAA,MACZ;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,EAAU;AAAA,IACZ;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,QAAA,CAAS;AAAA,MACxC,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,EAAK;AAE/B,IAAA,UAAA,CAAW,KAAK,CAAA;AAEhB,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS,CAAA,YAAA,EAAe,IAAA,CAAK,MAAM,CAAA;AAAA,OACpC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,OAAA;AAAA,MACV,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,4BACG,WAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,OAAA,wBAAY,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAC9B,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,cAAA;AAAA,QACH,OAAA,EAAQ,WAAA;AAAA,QACR,OAAA,sBAAU,aAAA,EAAA,EAAc,CAAA;AAAA,QACxB,OAAA,EAAS,kBAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QAET,QAAA,EAAA,KAAA,IAAS;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;;;;"}
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { rootCatalogRenovateRouteRef, rootRouteRef } from './routes';\nimport { renovateApiRef } from './api';\nimport { RenovateClient } from '@secustor/backstage-plugin-renovate-client';\n\nexport const renovatePlugin = createPlugin({\n id: 'renovate',\n apis: [\n createApiFactory({\n api: renovateApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, fetchApi }) =>\n new RenovateClient({ discoveryApi, fetchApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport const RenovatePage = renovatePlugin.provide(\n createRoutableExtension({\n name: 'RenovatePage',\n component: () =>\n import('./components/RenovateDefaultOverview').then(\n m => m.RenovateDefaultOverview,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityRenovateContent = renovatePlugin.provide(\n createRoutableExtension({\n name: 'EntityRenovateContent',\n component: () =>\n import('./components/EntityRenovateContent').then(\n m => m.EntityRenovateContent,\n ),\n mountPoint: rootCatalogRenovateRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAWO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { rootCatalogRenovateRouteRef, rootRouteRef } from './routes';\nimport { renovateApiRef } from './api';\nimport { RenovateClient } from '@secustor/backstage-plugin-renovate-client';\n\nexport const renovatePlugin = createPlugin({\n id: 'renovate',\n apis: [\n createApiFactory({\n api: renovateApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, fetchApi }) =>\n new RenovateClient({ discoveryApi, fetchApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport const RenovatePage = renovatePlugin.provide(\n createRoutableExtension({\n name: 'RenovatePage',\n component: () =>\n import('./components/RenovateDefaultOverview').then(\n m => m.RenovateDefaultOverview,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityRenovateContent = renovatePlugin.provide(\n createRoutableExtension({\n name: 'EntityRenovateContent',\n component: () =>\n import('./components/EntityRenovateContent').then(\n m => m.EntityRenovateContent,\n ),\n mountPoint: rootCatalogRenovateRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAWO,MAAM,iBAAiB,YAAA,CAAa;AAAA,EACzC,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,cAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KACjC,IAAI,cAAA,CAAe,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,KAChD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,eAAe,cAAA,CAAe,OAAA;AAAA,EACzC,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,cAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,mDAAsC,CAAA,CAAE,IAAA;AAAA,MAC7C,OAAK,CAAA,CAAE;AAAA,KACT;AAAA,IACF,UAAA,EAAY;AAAA,GACb;AACH;AAEO,MAAM,wBAAwB,cAAA,CAAe,OAAA;AAAA,EAClD,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,uBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,iDAAoC,CAAA,CAAE,IAAA;AAAA,MAC3C,OAAK,CAAA,CAAE;AAAA,KACT;AAAA,IACF,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
|
package/dist/routes.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'renovate',\n});\n\nexport const rootCatalogRenovateRouteRef = createRouteRef({\n id: 'renovate:catalog-reader-view',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'renovate',\n});\n\nexport const rootCatalogRenovateRouteRef = createRouteRef({\n id: 'renovate:catalog-reader-view',\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;AAEM,MAAM,8BAA8B,cAAA,CAAe;AAAA,EACxD,EAAA,EAAI;AACN,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versioning.esm.js","sources":["../../src/tools/versioning.ts"],"sourcesContent":["import { Update } from '@secustor/backstage-plugin-renovate-common';\nimport is from '@sindresorhus/is';\n\nexport function getBiggestUpdate(updates: Update[]): Update | null {\n if (updates.length === 0) {\n return null;\n }\n return updates.reduce(pickUpdate);\n}\n\nfunction coerceNumber(value: unknown): number {\n if (!is.number(value)) {\n return 0;\n }\n return value;\n}\n\nfunction pickUpdate(a: Update, b: Update): Update {\n const aPrio = getPriority(a.updateType);\n const bPrio = getPriority(b.updateType);\n // if the update type is different, pick the higher update directly\n if (aPrio > bPrio) {\n return a;\n }\n if (aPrio < bPrio) {\n return b;\n }\n\n const aUpdate = coerceNumber(a?.[`new${a.updateType.toUpperCase()}`]);\n const bUpdate = coerceNumber(b?.[`new${a.updateType.toUpperCase()}`]);\n if (aUpdate > bUpdate) {\n return a;\n }\n if (aUpdate < bUpdate) {\n return b;\n }\n return a;\n}\n\nfunction getPriority(value: string): number {\n switch (value) {\n case 'major':\n return 2;\n case 'minor':\n return 1;\n case 'patch':\n return 0;\n default:\n return -1; // ignore replacement updates and such\n }\n}\n"],"names":[],"mappings":";;AAGO,SAAS,iBAAiB,
|
|
1
|
+
{"version":3,"file":"versioning.esm.js","sources":["../../src/tools/versioning.ts"],"sourcesContent":["import { Update } from '@secustor/backstage-plugin-renovate-common';\nimport is from '@sindresorhus/is';\n\nexport function getBiggestUpdate(updates: Update[]): Update | null {\n if (updates.length === 0) {\n return null;\n }\n return updates.reduce(pickUpdate);\n}\n\nfunction coerceNumber(value: unknown): number {\n if (!is.number(value)) {\n return 0;\n }\n return value;\n}\n\nfunction pickUpdate(a: Update, b: Update): Update {\n const aPrio = getPriority(a.updateType);\n const bPrio = getPriority(b.updateType);\n // if the update type is different, pick the higher update directly\n if (aPrio > bPrio) {\n return a;\n }\n if (aPrio < bPrio) {\n return b;\n }\n\n const aUpdate = coerceNumber(a?.[`new${a.updateType.toUpperCase()}`]);\n const bUpdate = coerceNumber(b?.[`new${a.updateType.toUpperCase()}`]);\n if (aUpdate > bUpdate) {\n return a;\n }\n if (aUpdate < bUpdate) {\n return b;\n }\n return a;\n}\n\nfunction getPriority(value: string): number {\n switch (value) {\n case 'major':\n return 2;\n case 'minor':\n return 1;\n case 'patch':\n return 0;\n default:\n return -1; // ignore replacement updates and such\n }\n}\n"],"names":[],"mappings":";;AAGO,SAAS,iBAAiB,OAAA,EAAkC;AACjE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAO,UAAU,CAAA;AAClC;AAEA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,IAAI,CAAC,EAAA,CAAG,MAAA,CAAO,KAAK,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,UAAA,CAAW,GAAW,CAAA,EAAmB;AAChD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,CAAE,UAAU,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,CAAE,UAAU,CAAA;AAEtC,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,GAAA,EAAM,EAAE,UAAA,CAAW,WAAA,EAAa,CAAA,CAAE,CAAC,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,GAAA,EAAM,EAAE,UAAA,CAAW,WAAA,EAAa,CAAA,CAAE,CAAC,CAAA;AACpE,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secustor/backstage-plugin-renovate",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.3",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "LGPL-3.0-or-later",
|
|
@@ -68,15 +68,15 @@
|
|
|
68
68
|
"postpack": "backstage-cli package postpack"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@backstage/catalog-model": "^1.7.
|
|
72
|
-
"@backstage/core-compat-api": "^0.
|
|
73
|
-
"@backstage/core-components": "^0.17.
|
|
74
|
-
"@backstage/core-plugin-api": "^1.10.
|
|
71
|
+
"@backstage/catalog-model": "^1.7.5",
|
|
72
|
+
"@backstage/core-compat-api": "^0.5.0",
|
|
73
|
+
"@backstage/core-components": "^0.17.5",
|
|
74
|
+
"@backstage/core-plugin-api": "^1.10.9",
|
|
75
75
|
"@backstage/errors": "^1.2.7",
|
|
76
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
77
|
-
"@backstage/integration-react": "^1.2.
|
|
78
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
79
|
-
"@backstage/theme": "^0.6.
|
|
76
|
+
"@backstage/frontend-plugin-api": "^0.11.0",
|
|
77
|
+
"@backstage/integration-react": "^1.2.9",
|
|
78
|
+
"@backstage/plugin-catalog-react": "^1.20.1",
|
|
79
|
+
"@backstage/theme": "^0.6.8",
|
|
80
80
|
"@emotion/react": "^11.13.3",
|
|
81
81
|
"@emotion/styled": "^11.13.0",
|
|
82
82
|
"@mui/icons-material": "^7.0.0",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"@mui/material": "^7.0.0",
|
|
85
85
|
"@mui/styles": "^6.1.0",
|
|
86
86
|
"@mui/x-data-grid": "^8.0.0",
|
|
87
|
-
"@secustor/backstage-plugin-renovate-client": "^0.10.
|
|
88
|
-
"@secustor/backstage-plugin-renovate-common": "^0.9.
|
|
87
|
+
"@secustor/backstage-plugin-renovate-client": "^0.10.7",
|
|
88
|
+
"@secustor/backstage-plugin-renovate-common": "^0.9.3",
|
|
89
89
|
"@sindresorhus/is": "^4.6.0",
|
|
90
90
|
"@textea/json-viewer": "^4.0.0",
|
|
91
91
|
"git-url-parse": "^16.0.0",
|
|
@@ -96,11 +96,11 @@
|
|
|
96
96
|
"react-dom": "*"
|
|
97
97
|
},
|
|
98
98
|
"devDependencies": {
|
|
99
|
-
"@backstage/cli": "^0.
|
|
100
|
-
"@backstage/core-app-api": "^1.
|
|
101
|
-
"@backstage/dev-utils": "^1.1.
|
|
102
|
-
"@backstage/frontend-defaults": "^0.
|
|
103
|
-
"@backstage/test-utils": "^1.7.
|
|
99
|
+
"@backstage/cli": "^0.34.0",
|
|
100
|
+
"@backstage/core-app-api": "^1.18.0",
|
|
101
|
+
"@backstage/dev-utils": "^1.1.13",
|
|
102
|
+
"@backstage/frontend-defaults": "^0.3.0",
|
|
103
|
+
"@backstage/test-utils": "^1.7.11",
|
|
104
104
|
"@testing-library/jest-dom": "^6.0.0",
|
|
105
105
|
"@testing-library/react": "^16.0.0",
|
|
106
106
|
"@testing-library/user-event": "^14.0.0",
|