@anyshift/backstage-plugin-anyshift 0.1.0-beta.1
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 +6 -0
- package/LICENSE +176 -0
- package/README.md +9 -0
- package/dist/api/AnyshiftApi.esm.js +80 -0
- package/dist/api/AnyshiftApi.esm.js.map +1 -0
- package/dist/components/AnyshiftPermissionBoundary.esm.js +25 -0
- package/dist/components/AnyshiftPermissionBoundary.esm.js.map +1 -0
- package/dist/components/entity/AnyshiftEntityContent.esm.js +213 -0
- package/dist/components/entity/AnyshiftEntityContent.esm.js.map +1 -0
- package/dist/components/entity/BriefSections.esm.js +218 -0
- package/dist/components/entity/BriefSections.esm.js.map +1 -0
- package/dist/components/entity/DatadogLiveSignal.esm.js +190 -0
- package/dist/components/entity/DatadogLiveSignal.esm.js.map +1 -0
- package/dist/components/entity/EvidenceDisclosure.esm.js +20 -0
- package/dist/components/entity/EvidenceDisclosure.esm.js.map +1 -0
- package/dist/components/entity/MermaidArchitecture.esm.js +89 -0
- package/dist/components/entity/MermaidArchitecture.esm.js.map +1 -0
- package/dist/components/entity/SectionPresenters.esm.js +341 -0
- package/dist/components/entity/SectionPresenters.esm.js.map +1 -0
- package/dist/components/entity/architectureDiagram.esm.js +236 -0
- package/dist/components/entity/architectureDiagram.esm.js.map +1 -0
- package/dist/components/entity/sectionData.esm.js +127 -0
- package/dist/components/entity/sectionData.esm.js.map +1 -0
- package/dist/components/explorer/AnyshiftExplorerPage.esm.js +193 -0
- package/dist/components/explorer/AnyshiftExplorerPage.esm.js.map +1 -0
- package/dist/components/explorer/DatadogOperationsRadar.esm.js +294 -0
- package/dist/components/explorer/DatadogOperationsRadar.esm.js.map +1 -0
- package/dist/index.d.ts +127 -0
- package/dist/index.esm.js +4 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/package.json.esm.js +96 -0
- package/dist/package.json.esm.js.map +1 -0
- package/dist/plugin.esm.js +49 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +6 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Typography, Box, Grid, Button, makeStyles, Chip, Divider } from '@material-ui/core';
|
|
3
|
+
import { InfoCard } from '@backstage/core-components';
|
|
4
|
+
import { EntityRefLink } from '@backstage/plugin-catalog-react';
|
|
5
|
+
import { EvidenceDisclosure } from '../entity/EvidenceDisclosure.esm.js';
|
|
6
|
+
|
|
7
|
+
const COLORS = {
|
|
8
|
+
datadog: "#632ca6",
|
|
9
|
+
firing: "#d63230",
|
|
10
|
+
noisy: "#d97706",
|
|
11
|
+
unavailable: "#6b7280"
|
|
12
|
+
};
|
|
13
|
+
function resolveSignalEntity(entities, signal) {
|
|
14
|
+
for (const target of [signal.workload, signal.service]) {
|
|
15
|
+
if (!target) continue;
|
|
16
|
+
const matches = entities.filter((entity) => {
|
|
17
|
+
const annotated = entity.metadata.annotations?.["anyshift.io/target"];
|
|
18
|
+
const nameMatches = annotated === target || entity.metadata.name === target;
|
|
19
|
+
const namespace = entity.metadata.namespace ?? "default";
|
|
20
|
+
return nameMatches && (!signal.namespace || namespace === signal.namespace);
|
|
21
|
+
});
|
|
22
|
+
if (matches.length === 1) return matches[0];
|
|
23
|
+
const components = matches.filter((entity) => entity.kind === "Component");
|
|
24
|
+
if (components.length === 1) return components[0];
|
|
25
|
+
}
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
function globalDatadogViewFrom(signals, entities) {
|
|
29
|
+
const uniqueActive = /* @__PURE__ */ new Map();
|
|
30
|
+
for (const row of signals.active.firing ?? []) {
|
|
31
|
+
const key = [
|
|
32
|
+
row.monitor,
|
|
33
|
+
row.state,
|
|
34
|
+
row.service,
|
|
35
|
+
row.workload,
|
|
36
|
+
row.namespace
|
|
37
|
+
].filter(Boolean).join("|").toLocaleLowerCase();
|
|
38
|
+
if (!uniqueActive.has(key)) {
|
|
39
|
+
uniqueActive.set(key, {
|
|
40
|
+
...row,
|
|
41
|
+
entity: resolveSignalEntity(entities, row)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const activeRows = [...uniqueActive.values()].sort(
|
|
46
|
+
(left, right) => Number(Boolean(right.entity)) - Number(Boolean(left.entity))
|
|
47
|
+
).slice(0, 5);
|
|
48
|
+
const noiseRows = (signals.noise.monitors ?? []).slice(0, 5).map((row) => {
|
|
49
|
+
const workload = row.workloads[0];
|
|
50
|
+
return {
|
|
51
|
+
...row,
|
|
52
|
+
entity: resolveSignalEntity(entities, {
|
|
53
|
+
workload: workload?.name,
|
|
54
|
+
namespace: workload?.namespace,
|
|
55
|
+
service: row.services[0]
|
|
56
|
+
})
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
activeTotal: signals.active.total,
|
|
61
|
+
byState: signals.active.byState ?? [],
|
|
62
|
+
activeRows,
|
|
63
|
+
noiseCounts: signals.noise.counts,
|
|
64
|
+
noiseRows,
|
|
65
|
+
activeError: signals.active.state === "error" ? signals.active.message : void 0,
|
|
66
|
+
noiseError: signals.noise.state === "error" ? signals.noise.message : void 0
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const useStyles = makeStyles((theme) => ({
|
|
70
|
+
eyebrow: {
|
|
71
|
+
color: COLORS.datadog,
|
|
72
|
+
fontWeight: 700,
|
|
73
|
+
letterSpacing: "0.12em"
|
|
74
|
+
},
|
|
75
|
+
lane: {
|
|
76
|
+
height: "100%",
|
|
77
|
+
borderLeft: "4px solid",
|
|
78
|
+
padding: theme.spacing(0.5, 0, 0.5, 2)
|
|
79
|
+
},
|
|
80
|
+
laneTitle: {
|
|
81
|
+
fontWeight: 700,
|
|
82
|
+
letterSpacing: "-0.02em"
|
|
83
|
+
},
|
|
84
|
+
headline: {
|
|
85
|
+
fontWeight: 700,
|
|
86
|
+
fontVariantNumeric: "tabular-nums"
|
|
87
|
+
},
|
|
88
|
+
metrics: {
|
|
89
|
+
display: "flex",
|
|
90
|
+
flexWrap: "wrap",
|
|
91
|
+
gap: theme.spacing(1),
|
|
92
|
+
marginTop: theme.spacing(1)
|
|
93
|
+
},
|
|
94
|
+
metric: {
|
|
95
|
+
padding: theme.spacing(0.75, 1),
|
|
96
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
97
|
+
borderRadius: theme.shape.borderRadius,
|
|
98
|
+
fontVariantNumeric: "tabular-nums"
|
|
99
|
+
},
|
|
100
|
+
row: {
|
|
101
|
+
padding: theme.spacing(1.25, 0)
|
|
102
|
+
},
|
|
103
|
+
rowTitle: {
|
|
104
|
+
fontWeight: 600,
|
|
105
|
+
overflowWrap: "anywhere"
|
|
106
|
+
},
|
|
107
|
+
partial: {
|
|
108
|
+
marginTop: theme.spacing(2),
|
|
109
|
+
padding: theme.spacing(1),
|
|
110
|
+
borderRadius: theme.shape.borderRadius,
|
|
111
|
+
backgroundColor: theme.palette.action.hover
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
const DatadogOperationsRadar = ({
|
|
115
|
+
signals,
|
|
116
|
+
catalogEntities,
|
|
117
|
+
onRefresh,
|
|
118
|
+
refreshing = false,
|
|
119
|
+
error
|
|
120
|
+
}) => {
|
|
121
|
+
const classes = useStyles();
|
|
122
|
+
const view = globalDatadogViewFrom(signals, catalogEntities);
|
|
123
|
+
return /* @__PURE__ */ jsxs(
|
|
124
|
+
InfoCard,
|
|
125
|
+
{
|
|
126
|
+
title: "Operational pulse",
|
|
127
|
+
subheader: "What is burning now and what keeps paging teams",
|
|
128
|
+
action: /* @__PURE__ */ jsx(
|
|
129
|
+
Button,
|
|
130
|
+
{
|
|
131
|
+
"aria-label": "Refresh Datadog signals",
|
|
132
|
+
onClick: onRefresh,
|
|
133
|
+
disabled: refreshing,
|
|
134
|
+
size: "small",
|
|
135
|
+
children: refreshing ? "Refreshing\u2026" : "Refresh"
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
children: [
|
|
139
|
+
/* @__PURE__ */ jsx(Typography, { variant: "overline", className: classes.eyebrow, children: "Datadog \xB7 live graph signal" }),
|
|
140
|
+
/* @__PURE__ */ jsx(Box, { mt: 1, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
141
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsx(
|
|
142
|
+
SignalLane,
|
|
143
|
+
{
|
|
144
|
+
title: "On fire now",
|
|
145
|
+
color: view.activeError ? COLORS.unavailable : COLORS.firing,
|
|
146
|
+
classes,
|
|
147
|
+
children: /* @__PURE__ */ jsx(ActiveLane, { view, classes })
|
|
148
|
+
}
|
|
149
|
+
) }),
|
|
150
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, md: 6, children: /* @__PURE__ */ jsx(
|
|
151
|
+
SignalLane,
|
|
152
|
+
{
|
|
153
|
+
title: "Paging noise \xB7 7 days",
|
|
154
|
+
color: view.noiseError ? COLORS.unavailable : COLORS.noisy,
|
|
155
|
+
classes,
|
|
156
|
+
children: /* @__PURE__ */ jsx(NoiseLane, { view, classes })
|
|
157
|
+
}
|
|
158
|
+
) })
|
|
159
|
+
] }) }),
|
|
160
|
+
error && /* @__PURE__ */ jsx(Typography, { color: "error", component: "p", children: error }),
|
|
161
|
+
signals.state === "partial" && /* @__PURE__ */ jsx(
|
|
162
|
+
Typography,
|
|
163
|
+
{
|
|
164
|
+
variant: "caption",
|
|
165
|
+
color: "textSecondary",
|
|
166
|
+
component: "p",
|
|
167
|
+
className: classes.partial,
|
|
168
|
+
children: "Some Datadog evidence is temporarily unavailable."
|
|
169
|
+
}
|
|
170
|
+
),
|
|
171
|
+
/* @__PURE__ */ jsx(EvidenceDisclosure, { data: signals })
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
const SignalLane = ({
|
|
177
|
+
title,
|
|
178
|
+
color,
|
|
179
|
+
classes,
|
|
180
|
+
children
|
|
181
|
+
}) => /* @__PURE__ */ jsxs(Box, { className: classes.lane, style: { borderLeftColor: color }, children: [
|
|
182
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h5", className: classes.laneTitle, children: title }),
|
|
183
|
+
children
|
|
184
|
+
] });
|
|
185
|
+
const ActiveLane = ({
|
|
186
|
+
view,
|
|
187
|
+
classes
|
|
188
|
+
}) => {
|
|
189
|
+
if (view.activeError) {
|
|
190
|
+
return /* @__PURE__ */ jsx(Typography, { color: "error", children: view.activeError });
|
|
191
|
+
}
|
|
192
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
193
|
+
/* @__PURE__ */ jsxs(Box, { mt: 1, children: [
|
|
194
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "h4", className: classes.headline, children: [
|
|
195
|
+
formatNumber(view.activeTotal ?? 0),
|
|
196
|
+
" active monitors"
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsx(Box, { className: classes.metrics, children: view.byState.map((item) => /* @__PURE__ */ jsx(
|
|
199
|
+
Chip,
|
|
200
|
+
{
|
|
201
|
+
size: "small",
|
|
202
|
+
variant: "outlined",
|
|
203
|
+
label: `${formatNumber(item.count)} ${item.state}`
|
|
204
|
+
},
|
|
205
|
+
item.state
|
|
206
|
+
)) })
|
|
207
|
+
] }),
|
|
208
|
+
/* @__PURE__ */ jsx(
|
|
209
|
+
SignalRows,
|
|
210
|
+
{
|
|
211
|
+
rows: view.activeRows.map((row) => ({
|
|
212
|
+
key: [row.monitor, row.state, row.workload].join("|"),
|
|
213
|
+
title: row.monitor,
|
|
214
|
+
detail: [row.state, row.workload || row.service].filter(Boolean).join(" \xB7 "),
|
|
215
|
+
entity: row.entity
|
|
216
|
+
})),
|
|
217
|
+
empty: "No active Datadog monitors.",
|
|
218
|
+
classes
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
] });
|
|
222
|
+
};
|
|
223
|
+
const NoiseLane = ({
|
|
224
|
+
view,
|
|
225
|
+
classes
|
|
226
|
+
}) => {
|
|
227
|
+
if (view.noiseError) {
|
|
228
|
+
return /* @__PURE__ */ jsx(Typography, { color: "error", children: view.noiseError });
|
|
229
|
+
}
|
|
230
|
+
const counts = view.noiseCounts ?? {
|
|
231
|
+
totalFires: 0,
|
|
232
|
+
flapping: 0,
|
|
233
|
+
stuck: 0
|
|
234
|
+
};
|
|
235
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
236
|
+
/* @__PURE__ */ jsxs(Box, { mt: 1, children: [
|
|
237
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "h4", className: classes.headline, children: [
|
|
238
|
+
formatNumber(counts.totalFires),
|
|
239
|
+
" fires"
|
|
240
|
+
] }),
|
|
241
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.metrics, children: [
|
|
242
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.metric, children: [
|
|
243
|
+
counts.flapping,
|
|
244
|
+
" flapping"
|
|
245
|
+
] }),
|
|
246
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.metric, children: [
|
|
247
|
+
counts.stuck,
|
|
248
|
+
" stuck"
|
|
249
|
+
] })
|
|
250
|
+
] })
|
|
251
|
+
] }),
|
|
252
|
+
/* @__PURE__ */ jsx(
|
|
253
|
+
SignalRows,
|
|
254
|
+
{
|
|
255
|
+
rows: view.noiseRows.map((row, index) => ({
|
|
256
|
+
key: `${index}:${row.name}`,
|
|
257
|
+
title: row.name,
|
|
258
|
+
detail: `${formatNumber(row.fires)} fires \xB7 ${formatNumber(
|
|
259
|
+
row.recovers
|
|
260
|
+
)} recovers \xB7 ${row.noiseKind}`,
|
|
261
|
+
entity: row.entity
|
|
262
|
+
})),
|
|
263
|
+
empty: "No paging noise in this window.",
|
|
264
|
+
classes
|
|
265
|
+
}
|
|
266
|
+
)
|
|
267
|
+
] });
|
|
268
|
+
};
|
|
269
|
+
const SignalRows = ({
|
|
270
|
+
rows,
|
|
271
|
+
empty,
|
|
272
|
+
classes
|
|
273
|
+
}) => {
|
|
274
|
+
if (rows.length === 0) {
|
|
275
|
+
return /* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(Typography, { color: "textSecondary", children: empty }) });
|
|
276
|
+
}
|
|
277
|
+
return /* @__PURE__ */ jsxs(Box, { mt: 2, children: [
|
|
278
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
279
|
+
rows.map((row) => /* @__PURE__ */ jsxs(Box, { children: [
|
|
280
|
+
/* @__PURE__ */ jsxs(Box, { className: classes.row, children: [
|
|
281
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: classes.rowTitle, children: row.title }),
|
|
282
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", component: "p", children: row.detail }),
|
|
283
|
+
/* @__PURE__ */ jsx(Typography, { variant: "caption", component: "p", children: row.entity ? /* @__PURE__ */ jsx(EntityRefLink, { entityRef: row.entity }) : "Not mapped to a catalog service" })
|
|
284
|
+
] }),
|
|
285
|
+
/* @__PURE__ */ jsx(Divider, {})
|
|
286
|
+
] }, row.key))
|
|
287
|
+
] });
|
|
288
|
+
};
|
|
289
|
+
function formatNumber(value) {
|
|
290
|
+
return new Intl.NumberFormat("en-US").format(value);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export { DatadogOperationsRadar, globalDatadogViewFrom, resolveSignalEntity };
|
|
294
|
+
//# sourceMappingURL=DatadogOperationsRadar.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatadogOperationsRadar.esm.js","sources":["../../../src/components/explorer/DatadogOperationsRadar.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Chip,\n Divider,\n Grid,\n Typography,\n makeStyles,\n} from '@material-ui/core';\nimport { InfoCard } from '@backstage/core-components';\nimport type { Entity } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport type { DatadogSignals, DatadogSignalWorkload } from '../../api/types';\nimport { EvidenceDisclosure } from '../entity/EvidenceDisclosure';\n\nconst COLORS = {\n datadog: '#632ca6',\n firing: '#d63230',\n noisy: '#d97706',\n quiet: '#238636',\n unavailable: '#6b7280',\n};\n\ninterface ActiveSignalRow {\n monitor: string;\n state: string;\n service: string | null;\n workload: string | null;\n namespace: string | null;\n entity?: Entity;\n}\n\ninterface NoiseSignalRow {\n name: string;\n fires: number;\n recovers: number;\n pctSelfResolved: number;\n noiseKind: 'flapping' | 'stuck';\n services: string[];\n workloads: DatadogSignalWorkload[];\n entity?: Entity;\n}\n\nexport interface GlobalDatadogView {\n activeTotal?: number;\n byState: Array<{ state: string; count: number }>;\n activeRows: ActiveSignalRow[];\n noiseCounts?: { flapping: number; stuck: number; totalFires: number };\n noiseRows: NoiseSignalRow[];\n activeError?: string;\n noiseError?: string;\n}\n\nexport function resolveSignalEntity(\n entities: Entity[],\n signal: {\n workload?: string | null;\n namespace?: string | null;\n service?: string | null;\n },\n): Entity | undefined {\n for (const target of [signal.workload, signal.service]) {\n if (!target) continue;\n const matches = entities.filter(entity => {\n const annotated = entity.metadata.annotations?.['anyshift.io/target'];\n const nameMatches =\n annotated === target || entity.metadata.name === target;\n const namespace = entity.metadata.namespace ?? 'default';\n return (\n nameMatches && (!signal.namespace || namespace === signal.namespace)\n );\n });\n if (matches.length === 1) return matches[0];\n const components = matches.filter(entity => entity.kind === 'Component');\n if (components.length === 1) return components[0];\n }\n return undefined;\n}\n\nexport function globalDatadogViewFrom(\n signals: DatadogSignals,\n entities: Entity[],\n): GlobalDatadogView {\n const uniqueActive = new Map<string, ActiveSignalRow>();\n for (const row of signals.active.firing ?? []) {\n const key = [\n row.monitor,\n row.state,\n row.service,\n row.workload,\n row.namespace,\n ]\n .filter(Boolean)\n .join('|')\n .toLocaleLowerCase();\n if (!uniqueActive.has(key)) {\n uniqueActive.set(key, {\n ...row,\n entity: resolveSignalEntity(entities, row),\n });\n }\n }\n\n const activeRows = [...uniqueActive.values()]\n .sort(\n (left, right) =>\n Number(Boolean(right.entity)) - Number(Boolean(left.entity)),\n )\n .slice(0, 5);\n const noiseRows = (signals.noise.monitors ?? []).slice(0, 5).map(row => {\n const workload = row.workloads[0];\n return {\n ...row,\n entity: resolveSignalEntity(entities, {\n workload: workload?.name,\n namespace: workload?.namespace,\n service: row.services[0],\n }),\n };\n });\n\n return {\n activeTotal: signals.active.total,\n byState: signals.active.byState ?? [],\n activeRows,\n noiseCounts: signals.noise.counts,\n noiseRows,\n activeError:\n signals.active.state === 'error' ? signals.active.message : undefined,\n noiseError:\n signals.noise.state === 'error' ? signals.noise.message : undefined,\n };\n}\n\nconst useStyles = makeStyles(theme => ({\n eyebrow: {\n color: COLORS.datadog,\n fontWeight: 700,\n letterSpacing: '0.12em',\n },\n lane: {\n height: '100%',\n borderLeft: '4px solid',\n padding: theme.spacing(0.5, 0, 0.5, 2),\n },\n laneTitle: {\n fontWeight: 700,\n letterSpacing: '-0.02em',\n },\n headline: {\n fontWeight: 700,\n fontVariantNumeric: 'tabular-nums',\n },\n metrics: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n },\n metric: {\n padding: theme.spacing(0.75, 1),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n fontVariantNumeric: 'tabular-nums',\n },\n row: {\n padding: theme.spacing(1.25, 0),\n },\n rowTitle: {\n fontWeight: 600,\n overflowWrap: 'anywhere',\n },\n partial: {\n marginTop: theme.spacing(2),\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.action.hover,\n },\n}));\n\nexport const DatadogOperationsRadar = ({\n signals,\n catalogEntities,\n onRefresh,\n refreshing = false,\n error,\n}: {\n signals: DatadogSignals;\n catalogEntities: Entity[];\n onRefresh: () => void;\n refreshing?: boolean;\n error?: string;\n}) => {\n const classes = useStyles();\n const view = globalDatadogViewFrom(signals, catalogEntities);\n\n return (\n <InfoCard\n title=\"Operational pulse\"\n subheader=\"What is burning now and what keeps paging teams\"\n action={\n <Button\n aria-label=\"Refresh Datadog signals\"\n onClick={onRefresh}\n disabled={refreshing}\n size=\"small\"\n >\n {refreshing ? 'Refreshing…' : 'Refresh'}\n </Button>\n }\n >\n <Typography variant=\"overline\" className={classes.eyebrow}>\n Datadog · live graph signal\n </Typography>\n <Box mt={1}>\n <Grid container spacing={3}>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"On fire now\"\n color={view.activeError ? COLORS.unavailable : COLORS.firing}\n classes={classes}\n >\n <ActiveLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n <Grid item xs={12} md={6}>\n <SignalLane\n title=\"Paging noise · 7 days\"\n color={view.noiseError ? COLORS.unavailable : COLORS.noisy}\n classes={classes}\n >\n <NoiseLane view={view} classes={classes} />\n </SignalLane>\n </Grid>\n </Grid>\n </Box>\n {error && (\n <Typography color=\"error\" component=\"p\">\n {error}\n </Typography>\n )}\n {signals.state === 'partial' && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n component=\"p\"\n className={classes.partial}\n >\n Some Datadog evidence is temporarily unavailable.\n </Typography>\n )}\n <EvidenceDisclosure data={signals} />\n </InfoCard>\n );\n};\n\nconst SignalLane = ({\n title,\n color,\n classes,\n children,\n}: {\n title: string;\n color: string;\n classes: ReturnType<typeof useStyles>;\n children: React.ReactNode;\n}) => (\n <Box className={classes.lane} style={{ borderLeftColor: color }}>\n <Typography variant=\"h5\" className={classes.laneTitle}>\n {title}\n </Typography>\n {children}\n </Box>\n);\n\nconst ActiveLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.activeError) {\n return <Typography color=\"error\">{view.activeError}</Typography>;\n }\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {formatNumber(view.activeTotal ?? 0)} active monitors\n </Typography>\n <Box className={classes.metrics}>\n {view.byState.map(item => (\n <Chip\n key={item.state}\n size=\"small\"\n variant=\"outlined\"\n label={`${formatNumber(item.count)} ${item.state}`}\n />\n ))}\n </Box>\n </Box>\n <SignalRows\n rows={view.activeRows.map(row => ({\n key: [row.monitor, row.state, row.workload].join('|'),\n title: row.monitor,\n detail: [row.state, row.workload || row.service]\n .filter(Boolean)\n .join(' · '),\n entity: row.entity,\n }))}\n empty=\"No active Datadog monitors.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst NoiseLane = ({\n view,\n classes,\n}: {\n view: GlobalDatadogView;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (view.noiseError) {\n return <Typography color=\"error\">{view.noiseError}</Typography>;\n }\n const counts = view.noiseCounts ?? {\n totalFires: 0,\n flapping: 0,\n stuck: 0,\n };\n return (\n <>\n <Box mt={1}>\n <Typography variant=\"h4\" className={classes.headline}>\n {formatNumber(counts.totalFires)} fires\n </Typography>\n <Box className={classes.metrics}>\n <Box className={classes.metric}>{counts.flapping} flapping</Box>\n <Box className={classes.metric}>{counts.stuck} stuck</Box>\n </Box>\n </Box>\n <SignalRows\n rows={view.noiseRows.map((row, index) => ({\n key: `${index}:${row.name}`,\n title: row.name,\n detail: `${formatNumber(row.fires)} fires · ${formatNumber(\n row.recovers,\n )} recovers · ${row.noiseKind}`,\n entity: row.entity,\n }))}\n empty=\"No paging noise in this window.\"\n classes={classes}\n />\n </>\n );\n};\n\nconst SignalRows = ({\n rows,\n empty,\n classes,\n}: {\n rows: Array<{ key: string; title: string; detail: string; entity?: Entity }>;\n empty: string;\n classes: ReturnType<typeof useStyles>;\n}) => {\n if (rows.length === 0) {\n return (\n <Box mt={2}>\n <Typography color=\"textSecondary\">{empty}</Typography>\n </Box>\n );\n }\n return (\n <Box mt={2}>\n <Divider />\n {rows.map(row => (\n <Box key={row.key}>\n <Box className={classes.row}>\n <Typography variant=\"subtitle2\" className={classes.rowTitle}>\n {row.title}\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\" component=\"p\">\n {row.detail}\n </Typography>\n <Typography variant=\"caption\" component=\"p\">\n {row.entity ? (\n <EntityRefLink entityRef={row.entity} />\n ) : (\n 'Not mapped to a catalog service'\n )}\n </Typography>\n </Box>\n <Divider />\n </Box>\n ))}\n </Box>\n );\n};\n\nfunction formatNumber(value: number): string {\n return new Intl.NumberFormat('en-US').format(value);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as _backstage_catalog_model from '@backstage/catalog-model';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import * as _backstage_filter_predicates from '@backstage/filter-predicates';
|
|
4
|
+
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
5
|
+
import { AnyshiftCapabilities, ServiceBrief, BriefSectionName, BriefSectionResponse, EstateInsights, DatadogSignals, CatalogSummary, QueryResult } from '@anyshift/backstage-plugin-anyshift-common';
|
|
6
|
+
export { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, BriefSection, CatalogSummary, EstateInsights, GITHUB_PROJECT_SLUG_ANNOTATION, QueryResult, ServiceBrief, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
|
|
7
|
+
|
|
8
|
+
declare const anyshiftPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
9
|
+
root: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
10
|
+
}, {}, {
|
|
11
|
+
"api:anyshift": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
12
|
+
kind: "api";
|
|
13
|
+
name: undefined;
|
|
14
|
+
config: {};
|
|
15
|
+
configInput: {};
|
|
16
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
|
|
17
|
+
inputs: {};
|
|
18
|
+
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>;
|
|
19
|
+
}>;
|
|
20
|
+
"entity-content:anyshift/entity-content": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
21
|
+
kind: "entity-content";
|
|
22
|
+
name: "entity-content";
|
|
23
|
+
config: {
|
|
24
|
+
path: string | undefined;
|
|
25
|
+
title: string | undefined;
|
|
26
|
+
filter: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
27
|
+
group: string | false | undefined;
|
|
28
|
+
icon: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
configInput: {
|
|
31
|
+
path?: string | undefined;
|
|
32
|
+
title?: string | undefined;
|
|
33
|
+
filter?: _backstage_filter_predicates.FilterPredicate | undefined;
|
|
34
|
+
group?: string | false | undefined;
|
|
35
|
+
icon?: string | undefined;
|
|
36
|
+
};
|
|
37
|
+
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", {
|
|
38
|
+
optional: true;
|
|
39
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
40
|
+
optional: true;
|
|
41
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
42
|
+
optional: true;
|
|
43
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
|
|
44
|
+
optional: true;
|
|
45
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string | react.ReactElement<any, string | react.JSXElementConstructor<any>>, "catalog.entity-content-icon", {
|
|
46
|
+
optional: true;
|
|
47
|
+
}>;
|
|
48
|
+
inputs: {};
|
|
49
|
+
params: {
|
|
50
|
+
defaultPath?: [Error: `Use the 'path' param instead`];
|
|
51
|
+
path: string;
|
|
52
|
+
defaultTitle?: [Error: `Use the 'title' param instead`];
|
|
53
|
+
title: string;
|
|
54
|
+
defaultGroup?: [Error: `Use the 'group' param instead`];
|
|
55
|
+
group?: ("development" | "deployment" | "overview" | "documentation" | "operation" | "observability") | (string & {});
|
|
56
|
+
icon?: string | react.ReactElement;
|
|
57
|
+
loader: () => Promise<JSX.Element>;
|
|
58
|
+
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
59
|
+
filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
|
|
60
|
+
};
|
|
61
|
+
}>;
|
|
62
|
+
"page:anyshift": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
63
|
+
kind: "page";
|
|
64
|
+
name: undefined;
|
|
65
|
+
config: {
|
|
66
|
+
path: string | undefined;
|
|
67
|
+
title: string | undefined;
|
|
68
|
+
};
|
|
69
|
+
configInput: {
|
|
70
|
+
path?: string | undefined;
|
|
71
|
+
title?: string | undefined;
|
|
72
|
+
};
|
|
73
|
+
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", {
|
|
74
|
+
optional: true;
|
|
75
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.title", {
|
|
76
|
+
optional: true;
|
|
77
|
+
}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
|
|
78
|
+
optional: true;
|
|
79
|
+
}>;
|
|
80
|
+
inputs: {
|
|
81
|
+
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", {
|
|
82
|
+
optional: true;
|
|
83
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.title", {
|
|
84
|
+
optional: true;
|
|
85
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
|
|
86
|
+
optional: true;
|
|
87
|
+
}>, {
|
|
88
|
+
singleton: false;
|
|
89
|
+
optional: false;
|
|
90
|
+
internal: false;
|
|
91
|
+
}>;
|
|
92
|
+
};
|
|
93
|
+
params: {
|
|
94
|
+
path: string;
|
|
95
|
+
title?: string;
|
|
96
|
+
icon?: _backstage_frontend_plugin_api.IconElement;
|
|
97
|
+
loader?: () => Promise<react.JSX.Element>;
|
|
98
|
+
routeRef?: _backstage_frontend_plugin_api.RouteRef;
|
|
99
|
+
noHeader?: boolean;
|
|
100
|
+
};
|
|
101
|
+
}>;
|
|
102
|
+
}>;
|
|
103
|
+
|
|
104
|
+
interface AnyshiftApi {
|
|
105
|
+
capabilities(): Promise<AnyshiftCapabilities>;
|
|
106
|
+
brief(kind: string, target: string, options?: BriefRequestOptions): Promise<ServiceBrief>;
|
|
107
|
+
briefSection(kind: string, target: string, section: BriefSectionName, options?: BriefRequestOptions): Promise<BriefSectionResponse>;
|
|
108
|
+
insights(): Promise<EstateInsights>;
|
|
109
|
+
datadogSignals(options?: {
|
|
110
|
+
refresh?: boolean;
|
|
111
|
+
}): Promise<DatadogSignals>;
|
|
112
|
+
inventory(type: string, options?: {
|
|
113
|
+
limit?: number;
|
|
114
|
+
offset?: number;
|
|
115
|
+
}): Promise<CatalogSummary>;
|
|
116
|
+
query(sql: string): Promise<QueryResult>;
|
|
117
|
+
}
|
|
118
|
+
interface BriefRequestOptions {
|
|
119
|
+
namespace?: string;
|
|
120
|
+
refresh?: boolean;
|
|
121
|
+
}
|
|
122
|
+
declare const anyshiftApiRef: _backstage_frontend_plugin_api.ApiRef<AnyshiftApi> & {
|
|
123
|
+
readonly $$type: "@backstage/ApiRef";
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export { anyshiftApiRef, anyshiftPlugin, anyshiftPlugin as default };
|
|
127
|
+
export type { AnyshiftApi };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { anyshiftPlugin, anyshiftPlugin as default } from './plugin.esm.js';
|
|
2
|
+
export { anyshiftApiRef } from './api/AnyshiftApi.esm.js';
|
|
3
|
+
export { ANYSHIFT_KIND_ANNOTATION, ANYSHIFT_OBSERVED_SERVICE_ANNOTATION, ANYSHIFT_RESOURCE_ID_ANNOTATION, ANYSHIFT_RESOURCE_TYPE_ANNOTATION, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION, anyshiftQueryPermission, anyshiftViewPermission } from '@anyshift/backstage-plugin-anyshift-common';
|
|
4
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
var name = "@anyshift/backstage-plugin-anyshift";
|
|
2
|
+
var version = "0.1.0-beta.1";
|
|
3
|
+
var description = "Read-only Anyshift infrastructure context for Backstage";
|
|
4
|
+
var main = "src/index.ts";
|
|
5
|
+
var types = "src/index.ts";
|
|
6
|
+
var license = "Apache-2.0";
|
|
7
|
+
var repository = {
|
|
8
|
+
type: "git",
|
|
9
|
+
url: "https://github.com/anyshift-io/graph-api",
|
|
10
|
+
directory: "integrations/backstage/plugins/anyshift"
|
|
11
|
+
};
|
|
12
|
+
var homepage = "https://github.com/anyshift-io/graph-api/tree/main/integrations/backstage#readme";
|
|
13
|
+
var keywords = [
|
|
14
|
+
"backstage",
|
|
15
|
+
"anyshift",
|
|
16
|
+
"infrastructure",
|
|
17
|
+
"catalog"
|
|
18
|
+
];
|
|
19
|
+
var publishConfig = {
|
|
20
|
+
access: "public",
|
|
21
|
+
main: "dist/index.esm.js",
|
|
22
|
+
types: "dist/index.d.ts"
|
|
23
|
+
};
|
|
24
|
+
var backstage = {
|
|
25
|
+
role: "frontend-plugin",
|
|
26
|
+
pluginId: "anyshift",
|
|
27
|
+
features: {
|
|
28
|
+
".": "@backstage/FrontendPlugin"
|
|
29
|
+
},
|
|
30
|
+
pluginPackages: [
|
|
31
|
+
"@anyshift/backstage-plugin-anyshift",
|
|
32
|
+
"@anyshift/backstage-plugin-anyshift-backend",
|
|
33
|
+
"@anyshift/backstage-plugin-anyshift-common"
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
var sideEffects = false;
|
|
37
|
+
var scripts = {
|
|
38
|
+
start: "backstage-cli package start",
|
|
39
|
+
build: "backstage-cli package build",
|
|
40
|
+
lint: "backstage-cli package lint",
|
|
41
|
+
prepack: "backstage-cli package prepack && node ../../scripts/package-license.mjs add",
|
|
42
|
+
postpack: "node ../../scripts/package-license.mjs remove && backstage-cli package postpack",
|
|
43
|
+
test: "backstage-cli package test",
|
|
44
|
+
clean: "backstage-cli package clean"
|
|
45
|
+
};
|
|
46
|
+
var dependencies = {
|
|
47
|
+
"@anyshift/backstage-plugin-anyshift-common": "workspace:^",
|
|
48
|
+
"@backstage/catalog-model": "^1.9.0",
|
|
49
|
+
"@backstage/core-components": "^0.18.11",
|
|
50
|
+
"@backstage/frontend-plugin-api": "^0.17.2",
|
|
51
|
+
"@backstage/plugin-catalog-react": "^3.1.0",
|
|
52
|
+
"@backstage/plugin-permission-react": "^0.5.2",
|
|
53
|
+
"@backstage/theme": "^0.7.3",
|
|
54
|
+
"@material-ui/core": "^4.12.2",
|
|
55
|
+
"@material-ui/icons": "^4.9.1",
|
|
56
|
+
"@material-ui/lab": "^4.0.0-alpha.61",
|
|
57
|
+
mermaid: "^11.15.0"
|
|
58
|
+
};
|
|
59
|
+
var peerDependencies = {
|
|
60
|
+
react: "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
61
|
+
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
62
|
+
"react-router-dom": "^6.0.0"
|
|
63
|
+
};
|
|
64
|
+
var devDependencies = {
|
|
65
|
+
"@backstage/cli": "^0.36.3",
|
|
66
|
+
"@backstage/test-utils": "^1.7.12",
|
|
67
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
68
|
+
"@testing-library/react": "^14.0.0",
|
|
69
|
+
"@testing-library/user-event": "^14.0.0",
|
|
70
|
+
msw: "^1.0.0"
|
|
71
|
+
};
|
|
72
|
+
var files = [
|
|
73
|
+
"dist"
|
|
74
|
+
];
|
|
75
|
+
var _package = {
|
|
76
|
+
name: name,
|
|
77
|
+
version: version,
|
|
78
|
+
description: description,
|
|
79
|
+
main: main,
|
|
80
|
+
types: types,
|
|
81
|
+
license: license,
|
|
82
|
+
repository: repository,
|
|
83
|
+
homepage: homepage,
|
|
84
|
+
keywords: keywords,
|
|
85
|
+
publishConfig: publishConfig,
|
|
86
|
+
backstage: backstage,
|
|
87
|
+
sideEffects: sideEffects,
|
|
88
|
+
scripts: scripts,
|
|
89
|
+
dependencies: dependencies,
|
|
90
|
+
peerDependencies: peerDependencies,
|
|
91
|
+
devDependencies: devDependencies,
|
|
92
|
+
files: files
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export { backstage, _package as default, dependencies, description, devDependencies, files, homepage, keywords, license, main, name, peerDependencies, publishConfig, repository, scripts, sideEffects, types, version };
|
|
96
|
+
//# sourceMappingURL=package.json.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import DeviceHubIcon from '@material-ui/icons/DeviceHub';
|
|
3
|
+
import { ApiBlueprint, fetchApiRef, discoveryApiRef, PageBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
4
|
+
import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
5
|
+
import { anyshiftViewPermission, ANYSHIFT_TARGET_ANNOTATION, GITHUB_PROJECT_SLUG_ANNOTATION } from '@anyshift/backstage-plugin-anyshift-common';
|
|
6
|
+
import { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary.esm.js';
|
|
7
|
+
import { AnyshiftClient, anyshiftApiRef } from './api/AnyshiftApi.esm.js';
|
|
8
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
9
|
+
|
|
10
|
+
const anyshiftApi = ApiBlueprint.make({
|
|
11
|
+
params: (defineParams) => defineParams({
|
|
12
|
+
api: anyshiftApiRef,
|
|
13
|
+
deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },
|
|
14
|
+
factory: ({ discoveryApi, fetchApi }) => new AnyshiftClient({ discoveryApi, fetchApi })
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
const anyshiftPage = PageBlueprint.make({
|
|
18
|
+
params: {
|
|
19
|
+
path: "/anyshift",
|
|
20
|
+
title: "Anyshift",
|
|
21
|
+
icon: /* @__PURE__ */ jsx(DeviceHubIcon, { fontSize: "inherit" }),
|
|
22
|
+
routeRef: rootRouteRef,
|
|
23
|
+
noHeader: true,
|
|
24
|
+
loader: () => import('./components/explorer/AnyshiftExplorerPage.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.AnyshiftExplorerPage, {}) }))
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const anyshiftEntityContent = EntityContentBlueprint.make({
|
|
28
|
+
name: "entity-content",
|
|
29
|
+
params: {
|
|
30
|
+
path: "/anyshift",
|
|
31
|
+
title: "Anyshift",
|
|
32
|
+
group: "observability",
|
|
33
|
+
filter: (entity) => Boolean(
|
|
34
|
+
entity.metadata.annotations?.[ANYSHIFT_TARGET_ANNOTATION] || entity.metadata.annotations?.[GITHUB_PROJECT_SLUG_ANNOTATION]
|
|
35
|
+
),
|
|
36
|
+
loader: () => import('./components/entity/AnyshiftEntityContent.esm.js').then((module) => /* @__PURE__ */ jsx(AnyshiftPermissionBoundary, { permission: anyshiftViewPermission, children: /* @__PURE__ */ jsx(module.AnyshiftEntityContent, {}) }))
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const anyshiftPlugin = createFrontendPlugin({
|
|
40
|
+
pluginId: "anyshift",
|
|
41
|
+
info: {
|
|
42
|
+
packageJson: () => import('./package.json.esm.js')
|
|
43
|
+
},
|
|
44
|
+
routes: { root: rootRouteRef },
|
|
45
|
+
extensions: [anyshiftApi, anyshiftPage, anyshiftEntityContent]
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export { anyshiftPlugin };
|
|
49
|
+
//# sourceMappingURL=plugin.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import DeviceHubIcon from '@material-ui/icons/DeviceHub';\nimport {\n ApiBlueprint,\n PageBlueprint,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/frontend-plugin-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport {\n ANYSHIFT_TARGET_ANNOTATION,\n GITHUB_PROJECT_SLUG_ANNOTATION,\n anyshiftViewPermission,\n} from '@anyshift/backstage-plugin-anyshift-common';\nimport { AnyshiftPermissionBoundary } from './components/AnyshiftPermissionBoundary';\nimport { anyshiftApiRef, AnyshiftClient } from './api/AnyshiftApi';\nimport { rootRouteRef } from './routes';\n\nconst anyshiftApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: anyshiftApiRef,\n deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef },\n factory: ({ discoveryApi, fetchApi }) =>\n new AnyshiftClient({ discoveryApi, fetchApi }),\n }),\n});\n\nconst anyshiftPage = PageBlueprint.make({\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n icon: <DeviceHubIcon fontSize=\"inherit\" />,\n routeRef: rootRouteRef,\n noHeader: true,\n loader: () =>\n import('./components/explorer/AnyshiftExplorerPage').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftExplorerPage />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nconst anyshiftEntityContent = EntityContentBlueprint.make({\n name: 'entity-content',\n params: {\n path: '/anyshift',\n title: 'Anyshift',\n group: 'observability',\n filter: entity =>\n Boolean(\n entity.metadata.annotations?.[ANYSHIFT_TARGET_ANNOTATION] ||\n entity.metadata.annotations?.[GITHUB_PROJECT_SLUG_ANNOTATION],\n ),\n loader: () =>\n import('./components/entity/AnyshiftEntityContent').then(module => (\n <AnyshiftPermissionBoundary permission={anyshiftViewPermission}>\n <module.AnyshiftEntityContent />\n </AnyshiftPermissionBoundary>\n )),\n },\n});\n\nexport const anyshiftPlugin = createFrontendPlugin({\n pluginId: 'anyshift',\n info: {\n packageJson: () => import('../package.json'),\n },\n routes: { root: rootRouteRef },\n extensions: [anyshiftApi, anyshiftPage, anyshiftEntityContent],\n});\n\nexport default anyshiftPlugin;\n"],"names":[],"mappings":";;;;;;;;;AAkBA,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK;AAAA,EACpC,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,cAAA;AAAA,IACL,IAAA,EAAM,EAAE,YAAA,EAAc,eAAA,EAAiB,UAAU,WAAA,EAAY;AAAA,IAC7D,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAA,EAAS,KACjC,IAAI,cAAA,CAAe,EAAE,YAAA,EAAc,QAAA,EAAU;AAAA,GAChD;AACL,CAAC,CAAA;AAED,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK;AAAA,EACtC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,kBAAM,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,SAAA,EAAU,CAAA;AAAA,IACxC,QAAA,EAAU,YAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,QAAQ,MACN,OAAO,mDAA4C,CAAA,CAAE,KAAK,CAAA,MAAA,qBACxD,GAAA,CAAC,0BAAA,EAAA,EAA2B,UAAA,EAAY,wBACtC,QAAA,kBAAA,GAAA,CAAC,MAAA,CAAO,oBAAA,EAAP,EAA4B,GAC/B,CACD;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,qBAAA,GAAwB,uBAAuB,IAAA,CAAK;AAAA,EACxD,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,QAAQ,CAAA,MAAA,KACN,OAAA;AAAA,MACE,MAAA,CAAO,SAAS,WAAA,GAAc,0BAA0B,KACtD,MAAA,CAAO,QAAA,CAAS,cAAc,8BAA8B;AAAA,KAChE;AAAA,IACF,QAAQ,MACN,OAAO,kDAA2C,CAAA,CAAE,KAAK,CAAA,MAAA,qBACvD,GAAA,CAAC,0BAAA,EAAA,EAA2B,UAAA,EAAY,wBACtC,QAAA,kBAAA,GAAA,CAAC,MAAA,CAAO,qBAAA,EAAP,EAA6B,GAChC,CACD;AAAA;AAEP,CAAC,CAAA;AAEM,MAAM,iBAAiB,oBAAA,CAAqB;AAAA,EACjD,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,MAAM,OAAO,uBAAiB;AAAA,GAC7C;AAAA,EACA,MAAA,EAAQ,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,EAC7B,UAAA,EAAY,CAAC,WAAA,EAAa,YAAA,EAAc,qBAAqB;AAC/D,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/frontend-plugin-api';\n\nexport const rootRouteRef = createRouteRef();\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA;;;;"}
|