@backstage-community/plugin-xcmetrics 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +23 -0
- package/dist/alpha.d.ts +72 -0
- package/dist/alpha.esm.js +39 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/components/StatusIcon/StatusIcon.esm.js +11 -5
- package/dist/components/StatusIcon/StatusIcon.esm.js.map +1 -1
- package/dist/components/XcmetricsLayout/XcmetricsLayout.esm.js +6 -4
- package/dist/components/XcmetricsLayout/XcmetricsLayout.esm.js.map +1 -1
- package/dist/components/XcmetricsLayout/index.esm.js +2 -2
- package/package.json +44 -21
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @backstage-community/plugin-xcmetrics
|
|
2
2
|
|
|
3
|
+
## 0.20.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 08f9100: Backstage version bump to v1.51.0
|
|
8
|
+
- 2e308bf: Backstage version bump to v1.52.0
|
|
9
|
+
- 7630621: Backstage version bump to v1.53.0
|
|
10
|
+
- 802f94d: Backstage version bump to v1.54.5
|
|
11
|
+
- 80b2efa: Added support for the new frontend system via a `/alpha` export.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 5427339: Updated dependency `lodash` to `^4.18.1`.
|
|
16
|
+
- ea994d1: Added listDeprecations check to the workspaces/xcmetrics and fixed the deprecations in StatusIcon.tsx and XcmetricsLayout.tsx
|
|
17
|
+
|
|
18
|
+
## 0.19.0
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
22
|
+
- b1971da: Backstage version bump to v1.50.2
|
|
23
|
+
|
|
3
24
|
## 0.18.0
|
|
4
25
|
|
|
5
26
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -35,3 +35,26 @@ proxy:
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Start Backstage and navigate to `/xcmetrics` to view your build metrics!
|
|
38
|
+
|
|
39
|
+
## New Frontend System
|
|
40
|
+
|
|
41
|
+
If you are using Backstage feature discovery, the plugin can be discovered automatically. Otherwise, you can register the alpha entry manually in your app:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { createApp } from '@backstage/frontend-defaults';
|
|
45
|
+
import xcmetricsPlugin from '@backstage-community/plugin-xcmetrics/alpha';
|
|
46
|
+
|
|
47
|
+
const app = createApp({
|
|
48
|
+
features: [
|
|
49
|
+
// ...other features
|
|
50
|
+
xcmetricsPlugin,
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
This plugin provides the following new frontend system extensions:
|
|
56
|
+
|
|
57
|
+
- A page extension for the XCMetrics dashboard
|
|
58
|
+
- An API extension for `xcmetricsApiRef`
|
|
59
|
+
|
|
60
|
+
Use `@backstage-community/plugin-xcmetrics/alpha` to enable the plugin through the new frontend system.
|
package/dist/alpha.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
3
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @alpha
|
|
7
|
+
*/
|
|
8
|
+
declare const xcmetricsApiExtension: _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
9
|
+
kind: "api";
|
|
10
|
+
name: "xcmetrics-api";
|
|
11
|
+
config: {};
|
|
12
|
+
configInput: {};
|
|
13
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
14
|
+
inputs: {};
|
|
15
|
+
params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
|
|
16
|
+
}>;
|
|
17
|
+
/** @alpha */
|
|
18
|
+
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
19
|
+
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
20
|
+
}, {}, {
|
|
21
|
+
"api:xcmetrics/xcmetrics-api": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
22
|
+
kind: "api";
|
|
23
|
+
name: "xcmetrics-api";
|
|
24
|
+
config: {};
|
|
25
|
+
configInput: {};
|
|
26
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
27
|
+
inputs: {};
|
|
28
|
+
params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
|
|
29
|
+
}>;
|
|
30
|
+
"page:xcmetrics": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
31
|
+
kind: "page";
|
|
32
|
+
name: undefined;
|
|
33
|
+
config: {
|
|
34
|
+
path: string | undefined;
|
|
35
|
+
title: string | undefined;
|
|
36
|
+
};
|
|
37
|
+
configInput: {
|
|
38
|
+
path?: string | undefined;
|
|
39
|
+
title?: string | undefined;
|
|
40
|
+
};
|
|
41
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
42
|
+
optional: true;
|
|
43
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.title", {
|
|
44
|
+
optional: true;
|
|
45
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
|
|
46
|
+
optional: true;
|
|
47
|
+
}>;
|
|
48
|
+
inputs: {
|
|
49
|
+
pages: _backstage_frontend_plugin_api.ExtensionInput<_backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
50
|
+
optional: true;
|
|
51
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.title", {
|
|
52
|
+
optional: true;
|
|
53
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
|
|
54
|
+
optional: true;
|
|
55
|
+
}>, {
|
|
56
|
+
singleton: false;
|
|
57
|
+
optional: false;
|
|
58
|
+
internal: false;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
params: {
|
|
62
|
+
path: string;
|
|
63
|
+
title?: string;
|
|
64
|
+
icon?: _backstage_frontend_plugin_api.IconElement;
|
|
65
|
+
loader?: () => Promise<react.JSX.Element>;
|
|
66
|
+
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
67
|
+
noHeader?: boolean;
|
|
68
|
+
};
|
|
69
|
+
}>;
|
|
70
|
+
}>;
|
|
71
|
+
|
|
72
|
+
export { _default as default, xcmetricsApiExtension };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { PageBlueprint, ApiBlueprint, fetchApiRef, discoveryApiRef, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
3
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
4
|
+
import { xcmetricsApiRef } from './api/types.esm.js';
|
|
5
|
+
import { XcmetricsClient } from './api/XcmetricsClient.esm.js';
|
|
6
|
+
import AssessmentIcon from '@material-ui/icons/Assessment';
|
|
7
|
+
|
|
8
|
+
const xcmetricsPage = PageBlueprint.make({
|
|
9
|
+
params: {
|
|
10
|
+
path: "/xcmetrics",
|
|
11
|
+
routeRef: rootRouteRef,
|
|
12
|
+
loader: () => import('./components/XcmetricsLayout/index.esm.js').then((m) => /* @__PURE__ */ jsx(m.NfsXcmetricsLayout, {}))
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
const xcmetricsApiExtension = ApiBlueprint.make({
|
|
16
|
+
name: "xcmetrics-api",
|
|
17
|
+
params: (defineParams) => defineParams({
|
|
18
|
+
api: xcmetricsApiRef,
|
|
19
|
+
deps: {
|
|
20
|
+
discoveryApi: discoveryApiRef,
|
|
21
|
+
fetchApi: fetchApiRef
|
|
22
|
+
},
|
|
23
|
+
factory({ discoveryApi, fetchApi }) {
|
|
24
|
+
return new XcmetricsClient({ discoveryApi, fetchApi });
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
var alpha = createFrontendPlugin({
|
|
29
|
+
pluginId: "xcmetrics",
|
|
30
|
+
title: "XCMetrics",
|
|
31
|
+
icon: /* @__PURE__ */ jsx(AssessmentIcon, { fontSize: "inherit" }),
|
|
32
|
+
extensions: [xcmetricsPage, xcmetricsApiExtension],
|
|
33
|
+
routes: {
|
|
34
|
+
root: rootRouteRef
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export { alpha as default, xcmetricsApiExtension };
|
|
39
|
+
//# sourceMappingURL=alpha.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createFrontendPlugin,\n PageBlueprint,\n ApiBlueprint,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from './routes';\nimport { xcmetricsApiRef, XcmetricsClient } from './api';\n\nimport AssessmentIcon from '@material-ui/icons/Assessment';\n\nconst xcmetricsPage = PageBlueprint.make({\n params: {\n path: '/xcmetrics',\n routeRef: rootRouteRef,\n loader: () =>\n import('./components/XcmetricsLayout').then(m => (\n <m.NfsXcmetricsLayout />\n )),\n },\n});\n\n/**\n * @alpha\n */\nexport const xcmetricsApiExtension = ApiBlueprint.make({\n name: 'xcmetrics-api',\n params: defineParams =>\n defineParams({\n api: xcmetricsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new XcmetricsClient({ discoveryApi, fetchApi });\n },\n }),\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'xcmetrics',\n title: 'XCMetrics',\n icon: <AssessmentIcon fontSize=\"inherit\" />,\n extensions: [xcmetricsPage, xcmetricsApiExtension],\n routes: {\n root: rootRouteRef,\n },\n});\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,aAAA,GAAgB,cAAc,IAAA,CAAK;AAAA,EACvC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ,MACN,OAAO,2CAA8B,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBAC1C,GAAA,CAAC,CAAA,CAAE,kBAAA,EAAF,EAAqB,CACvB;AAAA;AAEP,CAAC,CAAA;AAKM,MAAM,qBAAA,GAAwB,aAAa,IAAA,CAAK;AAAA,EACrD,IAAA,EAAM,eAAA;AAAA,EACN,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,eAAA;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,eAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,MAAA,OAAO,IAAI,eAAA,CAAgB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,IACvD;AAAA,GACD;AACL,CAAC;AAGD,YAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,WAAA;AAAA,EACV,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,kBAAM,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,EACzC,UAAA,EAAY,CAAC,aAAA,EAAe,qBAAqB,CAAA;AAAA,EACjD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA;;;;"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { StatusAborted, StatusWarning, StatusError, StatusOK } from '@backstage/core-components';
|
|
3
3
|
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const StatusIcon = ({ buildStatus }) => {
|
|
5
|
+
switch (buildStatus) {
|
|
6
|
+
case "succeeded":
|
|
7
|
+
return /* @__PURE__ */ jsx(StatusOK, {});
|
|
8
|
+
case "failed":
|
|
9
|
+
return /* @__PURE__ */ jsx(StatusError, {});
|
|
10
|
+
case "stopped":
|
|
11
|
+
return /* @__PURE__ */ jsx(StatusWarning, {});
|
|
12
|
+
default:
|
|
13
|
+
return /* @__PURE__ */ jsx(StatusAborted, {});
|
|
14
|
+
}
|
|
8
15
|
};
|
|
9
|
-
const StatusIcon = ({ buildStatus }) => STATUS_ICONS[buildStatus] ?? /* @__PURE__ */ jsx(StatusAborted, {});
|
|
10
16
|
|
|
11
17
|
export { StatusIcon };
|
|
12
18
|
//# sourceMappingURL=StatusIcon.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/StatusIcon/StatusIcon.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { BuildStatus } from '../../api';\n\
|
|
1
|
+
{"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/StatusIcon/StatusIcon.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { BuildStatus } from '../../api';\n\ninterface StatusIconProps {\n buildStatus: BuildStatus;\n}\n\nexport const StatusIcon = ({ buildStatus }: StatusIconProps) => {\n switch (buildStatus) {\n case 'succeeded':\n return <StatusOK />;\n case 'failed':\n return <StatusError />;\n case 'stopped':\n return <StatusWarning />;\n default:\n return <StatusAborted />;\n }\n};\n"],"names":[],"mappings":";;;AA2BO,MAAM,UAAA,GAAa,CAAC,EAAE,WAAA,EAAY,KAAuB;AAC9D,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,WAAA;AACH,MAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,IACnB,KAAK,QAAA;AACH,MAAA,2BAAQ,WAAA,EAAA,EAAY,CAAA;AAAA,IACtB,KAAK,SAAA;AACH,MAAA,2BAAQ,aAAA,EAAA,EAAc,CAAA;AAAA,IACxB;AACE,MAAA,2BAAQ,aAAA,EAAA,EAAc,CAAA;AAAA;AAE5B;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { TabbedLayout, Content, Page, Header, HeaderLabel } from '@backstage/core-components';
|
|
3
3
|
import { Overview } from '../Overview/Overview.esm.js';
|
|
4
4
|
import { buildsRouteRef } from '../../routes.esm.js';
|
|
5
5
|
import { BuildList } from '../BuildList/BuildList.esm.js';
|
|
@@ -16,13 +16,15 @@ const TABS = [
|
|
|
16
16
|
component: /* @__PURE__ */ jsx(BuildList, {})
|
|
17
17
|
}
|
|
18
18
|
];
|
|
19
|
+
const XcmetricsTabs = () => /* @__PURE__ */ jsx(TabbedLayout, { children: TABS.map((tab) => /* @__PURE__ */ jsx(TabbedLayout.Route, { path: tab.path, title: tab.title, children: /* @__PURE__ */ jsx(Content, { children: tab.component }) }, tab.path)) });
|
|
19
20
|
const XcmetricsLayout = () => /* @__PURE__ */ jsxs(Page, { themeId: "tool", children: [
|
|
20
21
|
/* @__PURE__ */ jsxs(Header, { title: "XCMetrics", subtitle: "Dashboard", children: [
|
|
21
22
|
/* @__PURE__ */ jsx(HeaderLabel, { label: "Owner", value: "Spotify" }),
|
|
22
23
|
/* @__PURE__ */ jsx(HeaderLabel, { label: "Lifecycle", value: "Alpha" })
|
|
23
24
|
] }),
|
|
24
|
-
/* @__PURE__ */ jsx(
|
|
25
|
+
/* @__PURE__ */ jsx(XcmetricsTabs, {})
|
|
25
26
|
] });
|
|
27
|
+
const NfsXcmetricsLayout = () => /* @__PURE__ */ jsx(XcmetricsTabs, {});
|
|
26
28
|
|
|
27
|
-
export { XcmetricsLayout };
|
|
29
|
+
export { NfsXcmetricsLayout, XcmetricsLayout };
|
|
28
30
|
//# sourceMappingURL=XcmetricsLayout.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XcmetricsLayout.esm.js","sources":["../../../src/components/XcmetricsLayout/XcmetricsLayout.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {
|
|
1
|
+
{"version":3,"file":"XcmetricsLayout.esm.js","sources":["../../../src/components/XcmetricsLayout/XcmetricsLayout.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { ReactNode } from 'react';\nimport {\n Content,\n Header,\n HeaderLabel,\n Page,\n TabbedLayout,\n} from '@backstage/core-components';\nimport { Overview } from '../Overview';\nimport { buildsRouteRef } from '../../routes';\nimport { BuildList } from '../BuildList';\n\nexport interface TabConfig {\n path: string;\n title: string;\n component: ReactNode;\n}\n\nconst TABS: TabConfig[] = [\n {\n path: '/',\n title: 'Overview',\n component: <Overview />,\n },\n {\n path: buildsRouteRef.path,\n title: 'Builds',\n component: <BuildList />,\n },\n];\n\nconst XcmetricsTabs = () => (\n <TabbedLayout>\n {TABS.map(tab => (\n <TabbedLayout.Route key={tab.path} path={tab.path} title={tab.title}>\n <Content>{tab.component}</Content>\n </TabbedLayout.Route>\n ))}\n </TabbedLayout>\n);\n\n// Used by the old frontend system — includes the full page shell\nexport const XcmetricsLayout = () => (\n <Page themeId=\"tool\">\n <Header title=\"XCMetrics\" subtitle=\"Dashboard\">\n <HeaderLabel label=\"Owner\" value=\"Spotify\" />\n <HeaderLabel label=\"Lifecycle\" value=\"Alpha\" />\n </Header>\n <XcmetricsTabs />\n </Page>\n);\n\n// Used by the new frontend system — no page shell, just content.\n// The framework's PageLayout/PluginHeader provides the outer page shell.\nexport const NfsXcmetricsLayout = () => <XcmetricsTabs />;\n"],"names":[],"mappings":";;;;;;AAiCA,MAAM,IAAA,GAAoB;AAAA,EACxB;AAAA,IACE,IAAA,EAAM,GAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,sBAAY,QAAA,EAAA,EAAS;AAAA,GACvB;AAAA,EACA;AAAA,IACE,MAAM,cAAA,CAAe,IAAA;AAAA,IACrB,KAAA,EAAO,QAAA;AAAA,IACP,SAAA,sBAAY,SAAA,EAAA,EAAU;AAAA;AAE1B,CAAA;AAEA,MAAM,aAAA,GAAgB,sBACpB,GAAA,CAAC,YAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,IAAI,CAAA,GAAA,qBACR,GAAA,CAAC,YAAA,CAAa,KAAA,EAAb,EAAkC,IAAA,EAAM,IAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,KAAA,EAC5D,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,GAAA,CAAI,SAAA,EAAU,CAAA,EAAA,EADD,GAAA,CAAI,IAE7B,CACD,CAAA,EACH,CAAA;AAIK,MAAM,eAAA,GAAkB,sBAC7B,IAAA,CAAC,IAAA,EAAA,EAAK,SAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAM,WAAA,EAAY,QAAA,EAAS,WAAA,EACjC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAM,SAAA,EAAU,CAAA;AAAA,oBAC3C,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,WAAA,EAAY,OAAM,OAAA,EAAQ;AAAA,GAAA,EAC/C,CAAA;AAAA,sBACC,aAAA,EAAA,EAAc;AAAA,CAAA,EACjB;AAKK,MAAM,kBAAA,GAAqB,sBAAM,GAAA,CAAC,aAAA,EAAA,EAAc;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { XcmetricsLayout } from './XcmetricsLayout.esm.js';
|
|
1
|
+
import { NfsXcmetricsLayout, XcmetricsLayout } from './XcmetricsLayout.esm.js';
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
export { XcmetricsLayout };
|
|
5
|
+
export { NfsXcmetricsLayout, XcmetricsLayout };
|
|
6
6
|
//# sourceMappingURL=index.esm.js.map
|
package/package.json
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-xcmetrics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "A Backstage plugin that shows XCode build metrics for your components",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
7
7
|
"pluginId": "xcmetrics",
|
|
8
8
|
"pluginPackages": [
|
|
9
9
|
"@backstage-community/plugin-xcmetrics"
|
|
10
|
-
]
|
|
10
|
+
],
|
|
11
|
+
"features": {
|
|
12
|
+
"./alpha": "@backstage/FrontendPlugin"
|
|
13
|
+
}
|
|
11
14
|
},
|
|
12
15
|
"publishConfig": {
|
|
13
|
-
"access": "public"
|
|
14
|
-
"main": "dist/index.esm.js",
|
|
15
|
-
"types": "dist/index.d.ts"
|
|
16
|
+
"access": "public"
|
|
16
17
|
},
|
|
17
18
|
"homepage": "https://backstage.io",
|
|
18
19
|
"repository": {
|
|
@@ -22,8 +23,32 @@
|
|
|
22
23
|
},
|
|
23
24
|
"license": "Apache-2.0",
|
|
24
25
|
"sideEffects": false,
|
|
25
|
-
"
|
|
26
|
-
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": "./dist/index.esm.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.esm.js"
|
|
31
|
+
},
|
|
32
|
+
"./alpha": {
|
|
33
|
+
"backstage": "@backstage/FrontendPlugin",
|
|
34
|
+
"import": "./dist/alpha.esm.js",
|
|
35
|
+
"types": "./dist/alpha.d.ts",
|
|
36
|
+
"default": "./dist/alpha.esm.js"
|
|
37
|
+
},
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"typesVersions": {
|
|
41
|
+
"*": {
|
|
42
|
+
"alpha": [
|
|
43
|
+
"dist/alpha.d.ts"
|
|
44
|
+
],
|
|
45
|
+
"package.json": [
|
|
46
|
+
"package.json"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"main": "./dist/index.esm.js",
|
|
51
|
+
"types": "./dist/index.d.ts",
|
|
27
52
|
"files": [
|
|
28
53
|
"dist"
|
|
29
54
|
],
|
|
@@ -34,25 +59,30 @@
|
|
|
34
59
|
"prepack": "backstage-cli package prepack",
|
|
35
60
|
"postpack": "backstage-cli package postpack",
|
|
36
61
|
"start": "backstage-cli package start",
|
|
62
|
+
"start:alpha": "backstage-cli package start --entrypoint dev/alpha",
|
|
37
63
|
"test": "backstage-cli package test"
|
|
38
64
|
},
|
|
39
65
|
"dependencies": {
|
|
40
|
-
"@backstage/core-components": "^0.18.
|
|
41
|
-
"@backstage/core-plugin-api": "^1.12.
|
|
42
|
-
"@backstage/errors": "^1.
|
|
66
|
+
"@backstage/core-components": "^0.18.13",
|
|
67
|
+
"@backstage/core-plugin-api": "^1.12.9",
|
|
68
|
+
"@backstage/errors": "^1.3.1",
|
|
69
|
+
"@backstage/frontend-plugin-api": "^0.18.0",
|
|
43
70
|
"@material-ui/core": "^4.12.2",
|
|
44
71
|
"@material-ui/icons": "^4.9.1",
|
|
45
72
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
46
73
|
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
47
|
-
"lodash": "^4.
|
|
74
|
+
"lodash": "^4.18.1",
|
|
48
75
|
"luxon": "^3.0.0",
|
|
49
76
|
"react-use": "^17.2.4",
|
|
50
77
|
"recharts": "^2.5.0"
|
|
51
78
|
},
|
|
52
79
|
"devDependencies": {
|
|
53
|
-
"@backstage/cli": "^0.36.
|
|
54
|
-
"@backstage/dev-utils": "^1.1.
|
|
55
|
-
"@backstage/
|
|
80
|
+
"@backstage/cli": "^0.36.5",
|
|
81
|
+
"@backstage/dev-utils": "^1.1.26",
|
|
82
|
+
"@backstage/frontend-defaults": "^0.5.5",
|
|
83
|
+
"@backstage/frontend-test-utils": "^0.6.3",
|
|
84
|
+
"@backstage/test-utils": "^1.7.21",
|
|
85
|
+
"@backstage/ui": "^0.17.1",
|
|
56
86
|
"@testing-library/dom": "^10.0.0",
|
|
57
87
|
"@testing-library/jest-dom": "^6.0.0",
|
|
58
88
|
"@testing-library/react": "^15.0.0",
|
|
@@ -69,12 +99,5 @@
|
|
|
69
99
|
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
70
100
|
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
71
101
|
},
|
|
72
|
-
"typesVersions": {
|
|
73
|
-
"*": {
|
|
74
|
-
"package.json": [
|
|
75
|
-
"package.json"
|
|
76
|
-
]
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
102
|
"module": "./dist/index.esm.js"
|
|
80
103
|
}
|