@incident-io/backstage 0.1.0 → 0.2.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/README.md +22 -3
- package/config.d.ts +11 -5
- package/dist/alpha.esm.js +32 -6
- package/dist/alpha.esm.js.map +1 -1
- package/dist/{esm/client-646572ea.esm.js → api/client.esm.js} +6 -13
- package/dist/api/client.esm.js.map +1 -0
- package/dist/components/AlertListItem/index.esm.js +68 -0
- package/dist/components/AlertListItem/index.esm.js.map +1 -0
- package/dist/components/EntityAlertCard/index.esm.js +113 -0
- package/dist/components/EntityAlertCard/index.esm.js.map +1 -0
- package/dist/components/EntityIncidentCard/index.esm.js +125 -0
- package/dist/components/EntityIncidentCard/index.esm.js.map +1 -0
- package/dist/components/EntityOnCallCard/index.esm.js +198 -0
- package/dist/components/EntityOnCallCard/index.esm.js.map +1 -0
- package/dist/components/HomePageAlertCard/Content.esm.js +76 -0
- package/dist/components/HomePageAlertCard/Content.esm.js.map +1 -0
- package/dist/components/HomePageAlertCard/index.esm.js +2 -0
- package/dist/components/HomePageAlertCard/index.esm.js.map +1 -0
- package/dist/components/HomePageIncidentCard/Content.esm.js +54 -0
- package/dist/components/HomePageIncidentCard/Content.esm.js.map +1 -0
- package/dist/components/HomePageIncidentCard/Context.esm.js +33 -0
- package/dist/components/HomePageIncidentCard/Context.esm.js.map +1 -0
- package/dist/components/HomePageIncidentCard/index.esm.js +3 -0
- package/dist/components/HomePageIncidentCard/index.esm.js.map +1 -0
- package/dist/components/HomePageOnCallCard/Content.esm.js +38 -0
- package/dist/components/HomePageOnCallCard/Content.esm.js.map +1 -0
- package/dist/components/HomePageOnCallCard/index.esm.js +6 -0
- package/dist/components/HomePageOnCallCard/index.esm.js.map +1 -0
- package/dist/components/IncidentListItem/index.esm.js +68 -0
- package/dist/components/IncidentListItem/index.esm.js.map +1 -0
- package/dist/components/styles.esm.js +34 -0
- package/dist/components/styles.esm.js.map +1 -0
- package/dist/components/utils.esm.js +19 -0
- package/dist/components/utils.esm.js.map +1 -0
- package/dist/hooks/useIncidentRequest.esm.js +65 -0
- package/dist/hooks/useIncidentRequest.esm.js.map +1 -0
- package/dist/hooks/useOnCallRequest.esm.js +116 -0
- package/dist/hooks/useOnCallRequest.esm.js.map +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.esm.js +1 -64
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +99 -0
- package/dist/plugin.esm.js.map +1 -0
- package/package.json +44 -23
- package/src/alpha.test.ts +9 -0
- package/src/alpha.tsx +38 -4
- package/src/api/client.test.ts +43 -0
- package/src/api/types.test.ts +15 -0
- package/src/api/types.ts +49796 -11325
- package/src/components/AlertListItem/index.tsx +82 -0
- package/src/components/EntityAlertCard/index.test.tsx +242 -0
- package/src/components/EntityAlertCard/index.tsx +168 -0
- package/src/components/EntityIncidentCard/index.test.tsx +135 -0
- package/src/components/EntityIncidentCard/index.tsx +3 -23
- package/src/components/EntityOnCallCard/index.test.tsx +134 -0
- package/src/components/EntityOnCallCard/index.tsx +301 -0
- package/src/components/HomePageAlertCard/Content.test.tsx +56 -0
- package/src/components/HomePageAlertCard/Content.tsx +85 -0
- package/src/components/HomePageAlertCard/index.tsx +1 -0
- package/src/components/HomePageIncidentCard/Content.test.tsx +4 -3
- package/src/components/HomePageIncidentCard/Content.tsx +2 -2
- package/src/components/HomePageIncidentCard/Context.tsx +2 -2
- package/src/components/HomePageOnCallCard/Content.test.tsx +90 -0
- package/src/components/HomePageOnCallCard/Content.tsx +58 -0
- package/src/components/HomePageOnCallCard/index.ts +3 -0
- package/src/components/IncidentListItem/index.tsx +3 -26
- package/src/components/styles.tsx +30 -0
- package/src/components/utils.tsx +24 -0
- package/src/hooks/useIncidentRequest.test.ts +189 -0
- package/src/hooks/useIncidentRequest.ts +56 -3
- package/src/hooks/useOnCallRequest.test.ts +52 -0
- package/src/hooks/useOnCallRequest.ts +141 -0
- package/src/index.ts +4 -0
- package/src/plugin.ts +45 -1
- package/src/setupTests.ts +2 -2
- package/alpha/package.json +0 -7
- package/dist/esm/client-646572ea.esm.js.map +0 -1
- package/dist/esm/index-55bf4982.esm.js +0 -72
- package/dist/esm/index-55bf4982.esm.js.map +0 -1
- package/dist/esm/index-633a0241.esm.js +0 -96
- package/dist/esm/index-633a0241.esm.js.map +0 -1
- package/dist/esm/index-a220a8f7.esm.js +0 -116
- package/dist/esm/index-a220a8f7.esm.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/components/IncidentListItem/index.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 { DateTime, Duration } from \"luxon\";\nimport {\n Chip,\n IconButton,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n Tooltip,\n Typography,\n} from \"@material-ui/core\";\nimport OpenInBrowserIcon from \"@material-ui/icons/OpenInBrowser\";\nimport { components } from \"../../api/types\";\nimport {useStyles} from \"../styles\";\n\n// Single item in the list of on-going incidents.\nexport const IncidentListItem = ({\n baseUrl,\n incident,\n}: {\n baseUrl: string;\n incident: components[\"schemas\"][\"IncidentV2\"];\n}) => {\n const classes = useStyles();\n const reportedAt = incident.incident_timestamp_values?.find((ts) =>\n ts.incident_timestamp.name.match(/reported/i),\n );\n\n // If reported isn't here for some reason, use created at.\n const reportedAtDate = reportedAt?.value?.value || incident.created_at;\n\n const sinceReported =\n new Date().getTime() - new Date(reportedAtDate).getTime();\n const sinceReportedLabel = DateTime.local()\n .minus(Duration.fromMillis(sinceReported))\n .toRelative({ locale: \"en\" });\n const lead = incident.incident_role_assignments.find((roleAssignment) => {\n return roleAssignment.role.role_type === \"lead\";\n });\n\n return (\n <ListItem dense key={incident.id}>\n <ListItemText\n primary={\n <>\n <Chip\n data-testid={`chip-${incident.incident_status.id}`}\n label={incident.incident_status.name}\n size=\"small\"\n variant=\"outlined\"\n className={\n [\"active\"].includes(incident.incident_status.category)\n ? classes.error\n : classes.warning\n }\n />\n {incident.reference} {incident.name}\n </>\n }\n primaryTypographyProps={{\n variant: \"body1\",\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography noWrap variant=\"body2\" color=\"textSecondary\">\n Reported {sinceReportedLabel} and{\" \"}\n {lead?.assignee\n ? `${lead.assignee.name} is lead`\n : \"the lead is unassigned\"}\n .\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n <Tooltip title=\"View in incident.io\" placement=\"top\">\n <IconButton\n href={`${baseUrl}/incidents/${incident.id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"primary\"\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { makeStyles } from '@material-ui/core';
|
|
2
|
+
|
|
3
|
+
const useStyles = makeStyles((theme) => ({
|
|
4
|
+
listItemPrimary: {
|
|
5
|
+
display: "flex",
|
|
6
|
+
// vertically align with chip
|
|
7
|
+
fontWeight: "bold",
|
|
8
|
+
gap: theme.spacing(1)
|
|
9
|
+
},
|
|
10
|
+
warning: {
|
|
11
|
+
borderColor: theme.palette.warning.main,
|
|
12
|
+
color: theme.palette.warning.main,
|
|
13
|
+
"& *": {
|
|
14
|
+
color: theme.palette.warning.main
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
error: {
|
|
18
|
+
borderColor: theme.palette.error.main,
|
|
19
|
+
color: theme.palette.error.main,
|
|
20
|
+
"& *": {
|
|
21
|
+
color: theme.palette.error.main
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
success: {
|
|
25
|
+
borderColor: theme.palette.success.main,
|
|
26
|
+
color: theme.palette.success.main,
|
|
27
|
+
"& *": {
|
|
28
|
+
color: theme.palette.success.main
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
export { useStyles };
|
|
34
|
+
//# sourceMappingURL=styles.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.esm.js","sources":["../../src/components/styles.tsx"],"sourcesContent":["import { makeStyles, Theme } from \"@material-ui/core\";\n\nexport const useStyles = makeStyles<Theme>((theme) => ({\n listItemPrimary: {\n display: \"flex\", // vertically align with chip\n fontWeight: \"bold\",\n gap: theme.spacing(1), \n },\n warning: {\n borderColor: theme.palette.warning.main,\n color: theme.palette.warning.main,\n \"& *\": {\n color: theme.palette.warning.main,\n },\n },\n error: {\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n \"& *\": {\n color: theme.palette.error.main,\n },\n },\n success: {\n borderColor: theme.palette.success.main,\n color: theme.palette.success.main,\n \"& *\": {\n color: theme.palette.success.main,\n },\n },\n}));"],"names":[],"mappings":";;AAEO,MAAM,SAAA,GAAY,UAAA,CAAkB,CAAC,KAAA,MAAW;AAAA,EACrD,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,MAAA;AAAA;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GACtB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IACnC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA;AAC/B,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,IACjC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,IAC3B,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM;AAAA;AAC7B,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IACnC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA;AAC/B;AAEJ,CAAA,CAAE;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function getEntityFieldID(config, entity) {
|
|
2
|
+
switch (entity.kind) {
|
|
3
|
+
case "API":
|
|
4
|
+
return config.getOptional("incident.fields.api");
|
|
5
|
+
case "Component":
|
|
6
|
+
return config.getOptional("incident.fields.component");
|
|
7
|
+
case "Domain":
|
|
8
|
+
return config.getOptional("incident.fields.domain");
|
|
9
|
+
case "System":
|
|
10
|
+
return config.getOptional("incident.fields.system");
|
|
11
|
+
case "Group":
|
|
12
|
+
return config.getOptional("incident.fields.group");
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`unrecognised entity kind: ${entity.kind}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { getEntityFieldID };
|
|
19
|
+
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.esm.js","sources":["../../src/components/utils.tsx"],"sourcesContent":["import { Entity } from \"@backstage/catalog-model\";\nimport { ConfigApi } from \"@backstage/core-plugin-api\";\n\n\n// Find the ID of the custom field in incident that represents the association\n// to this type of entity.\n//\n// In practice, this will be kind=Component => ID of Affected components field.\nexport function getEntityFieldID(config: ConfigApi, entity: Entity) {\n switch (entity.kind) {\n case \"API\":\n return config.getOptional(\"incident.fields.api\");\n case \"Component\":\n return config.getOptional(\"incident.fields.component\");\n case \"Domain\":\n return config.getOptional(\"incident.fields.domain\");\n case \"System\":\n return config.getOptional(\"incident.fields.system\");\n case \"Group\":\n return config.getOptional(\"incident.fields.group\");\n default:\n throw new Error(`unrecognised entity kind: ${entity.kind}`);\n }\n}"],"names":[],"mappings":"AAQO,SAAS,gBAAA,CAAiB,QAAmB,MAAA,EAAgB;AAClE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,YAAY,qBAAqB,CAAA;AAAA,IACjD,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,CAAO,YAAY,2BAA2B,CAAA;AAAA,IACvD,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO,YAAY,wBAAwB,CAAA;AAAA,IACpD,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO,YAAY,wBAAwB,CAAA;AAAA,IACpD,KAAK,OAAA;AACH,MAAA,OAAO,MAAA,CAAO,YAAY,uBAAuB,CAAA;AAAA,IACnD;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA;AAEhE;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
2
|
+
import { useAsync } from 'react-use';
|
|
3
|
+
import { IncidentApiRef } from '../api/client.esm.js';
|
|
4
|
+
|
|
5
|
+
const useIncidentList = (query, deps) => {
|
|
6
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
7
|
+
const { value, loading, error } = useAsync(async () => {
|
|
8
|
+
return await IncidentApi.request({
|
|
9
|
+
path: `/v2/incidents?${query.toString()}`
|
|
10
|
+
});
|
|
11
|
+
}, deps);
|
|
12
|
+
return { loading, error, value };
|
|
13
|
+
};
|
|
14
|
+
const useAlertList = (status, deps) => {
|
|
15
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
16
|
+
const { value, loading, error } = useAsync(async () => {
|
|
17
|
+
const query = new URLSearchParams({ page_size: "25" });
|
|
18
|
+
if (status) query.set("status[one_of]", status);
|
|
19
|
+
return await IncidentApi.request({
|
|
20
|
+
path: `/v2/alerts?${query.toString()}`
|
|
21
|
+
});
|
|
22
|
+
}, [status, ...deps ?? []]);
|
|
23
|
+
return { loading, error, value };
|
|
24
|
+
};
|
|
25
|
+
const useAlertSourceList = () => {
|
|
26
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
27
|
+
const { value, loading, error } = useAsync(async () => {
|
|
28
|
+
return await IncidentApi.request({
|
|
29
|
+
path: `/v2/alert_sources`
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
return { loading, error, value };
|
|
33
|
+
};
|
|
34
|
+
const useIncidentAlertList = (incidentIds, deps) => {
|
|
35
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
36
|
+
const { value, loading, error } = useAsync(async () => {
|
|
37
|
+
if (incidentIds.length === 0) {
|
|
38
|
+
return { incident_alerts: [], pagination_meta: { page_size: 25 } };
|
|
39
|
+
}
|
|
40
|
+
const results = await Promise.all(
|
|
41
|
+
incidentIds.map(
|
|
42
|
+
(id) => IncidentApi.request({
|
|
43
|
+
path: `/v2/incident_alerts?incident_id=${id}&page_size=25`
|
|
44
|
+
})
|
|
45
|
+
)
|
|
46
|
+
);
|
|
47
|
+
return {
|
|
48
|
+
incident_alerts: results.flatMap((r) => r.incident_alerts),
|
|
49
|
+
pagination_meta: { page_size: 25 }
|
|
50
|
+
};
|
|
51
|
+
}, [incidentIds.join(","), ...deps ?? []]);
|
|
52
|
+
return { loading, error, value };
|
|
53
|
+
};
|
|
54
|
+
const useIdentity = () => {
|
|
55
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
56
|
+
const { value, loading, error } = useAsync(async () => {
|
|
57
|
+
return await IncidentApi.request({
|
|
58
|
+
path: `/v1/identity`
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return { value, loading, error };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export { useAlertList, useAlertSourceList, useIdentity, useIncidentAlertList, useIncidentList };
|
|
65
|
+
//# sourceMappingURL=useIncidentRequest.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIncidentRequest.esm.js","sources":["../../src/hooks/useIncidentRequest.ts"],"sourcesContent":["import { useApi } from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport { IncidentApiRef } from \"../api/client\";\nimport { components } from \"../api/types\";\nimport { DependencyList } from \"react\";\n\nexport const useIncidentList = (\n query: URLSearchParams,\n deps?: DependencyList,\n) => {\n const IncidentApi = useApi(IncidentApiRef);\n\n const { value, loading, error } = useAsync(async () => {\n return await IncidentApi.request<\n components[\"schemas\"][\"IncidentsListResultV2\"]\n >({\n path: `/v2/incidents?${query.toString()}`,\n });\n }, deps);\n\n return { loading, error, value };\n};\n\nexport const useAlertList = (status?: \"firing\" | \"resolved\", deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n\n const { value, loading, error } = useAsync(async () => {\n const query = new URLSearchParams({ page_size: \"25\" });\n if (status) query.set(\"status[one_of]\", status);\n return await IncidentApi.request<\n components[\"schemas\"][\"AlertsListResultV2\"]\n >({\n path: `/v2/alerts?${query.toString()}`,\n });\n }, [status, ...(deps ?? [])]);\n\n return { loading, error, value };\n};\n\nexport const useAlertSourceList = () => {\n const IncidentApi = useApi(IncidentApiRef);\n\n const { value, loading, error } = useAsync(async () => {\n return await IncidentApi.request<\n components[\"schemas\"][\"AlertSourcesListResultV2\"]\n >({\n path: `/v2/alert_sources`,\n });\n });\n\n return { loading, error, value };\n};\n\nexport const useIncidentAlertList = (incidentIds: string[], deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n\n const { value, loading, error } = useAsync(async () => {\n if (incidentIds.length === 0) {\n return { incident_alerts: [], pagination_meta: { page_size: 25 } };\n }\n const results = await Promise.all(\n incidentIds.map(id =>\n IncidentApi.request<components[\"schemas\"][\"AlertsListIncidentAlertsResultV2\"]>({\n path: `/v2/incident_alerts?incident_id=${id}&page_size=25`,\n }),\n ),\n );\n return {\n incident_alerts: results.flatMap(r => r.incident_alerts),\n pagination_meta: { page_size: 25 },\n };\n }, [incidentIds.join(\",\"), ...(deps ?? [])]);\n\n return { loading, error, value };\n};\n\nexport const useIdentity = () => {\n const IncidentApi = useApi(IncidentApiRef);\n\n const { value, loading, error } = useAsync(async () => {\n return await IncidentApi.request<\n components[\"schemas\"][\"UtilitiesIdentityResultV1\"]\n >({\n path: `/v1/identity`,\n });\n });\n\n return { value, loading, error };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
2
|
+
import { useAsync } from 'react-use';
|
|
3
|
+
import { IncidentApiRef } from '../api/client.esm.js';
|
|
4
|
+
|
|
5
|
+
const collectSlackChannelIds = (nodes) => {
|
|
6
|
+
const ids = [];
|
|
7
|
+
for (const node of nodes) {
|
|
8
|
+
const targets = node.level?.targets ?? node.notify_channel?.targets ?? [];
|
|
9
|
+
for (const t of targets) {
|
|
10
|
+
if (t.type === "slack_channel") ids.push(t.id);
|
|
11
|
+
}
|
|
12
|
+
if (node.if_else) {
|
|
13
|
+
ids.push(...collectSlackChannelIds(node.if_else.then_path));
|
|
14
|
+
ids.push(...collectSlackChannelIds(node.if_else.else_path));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return [...new Set(ids)];
|
|
18
|
+
};
|
|
19
|
+
const useEscalationPath = (escalationPathId, deps) => {
|
|
20
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
21
|
+
return useAsync(async () => {
|
|
22
|
+
if (!escalationPathId) return null;
|
|
23
|
+
const response = await IncidentApi.request({
|
|
24
|
+
path: `/v2/escalation_paths/${escalationPathId}`
|
|
25
|
+
});
|
|
26
|
+
const ep = response.escalation_path;
|
|
27
|
+
const channelNames = {};
|
|
28
|
+
const channelIds = collectSlackChannelIds(ep.path);
|
|
29
|
+
if (channelIds.length > 0) {
|
|
30
|
+
const typesResponse = await IncidentApi.request({
|
|
31
|
+
path: `/v3/catalog_types`
|
|
32
|
+
});
|
|
33
|
+
const slackChannelType = typesResponse.catalog_types.find((t) => t.type_name === "SlackChannel");
|
|
34
|
+
if (slackChannelType) {
|
|
35
|
+
const entriesResponse = await IncidentApi.request({
|
|
36
|
+
path: `/v3/catalog_entries?catalog_type_id=${slackChannelType.id}&page_size=250`
|
|
37
|
+
});
|
|
38
|
+
for (const entry of entriesResponse.catalog_entries) {
|
|
39
|
+
for (const id of channelIds) {
|
|
40
|
+
if (entry.aliases.includes(id)) {
|
|
41
|
+
channelNames[id] = entry.name;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { ep, channelNames };
|
|
48
|
+
}, deps);
|
|
49
|
+
};
|
|
50
|
+
const useSchedule = (scheduleId, deps) => {
|
|
51
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
52
|
+
return useAsync(async () => {
|
|
53
|
+
if (!scheduleId) return null;
|
|
54
|
+
const response = await IncidentApi.request({
|
|
55
|
+
path: `/v2/schedules/${scheduleId}`
|
|
56
|
+
});
|
|
57
|
+
return response.schedule;
|
|
58
|
+
}, deps);
|
|
59
|
+
};
|
|
60
|
+
const useOnCallData = (entityExternalId, deps) => {
|
|
61
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
62
|
+
const config = useApi(configApiRef);
|
|
63
|
+
return useAsync(async () => {
|
|
64
|
+
const catalogTypeId = config.getString("incident.onCall.catalogTypeId");
|
|
65
|
+
const typeResponse = await IncidentApi.request({
|
|
66
|
+
path: `/v3/catalog_types/${catalogTypeId}`
|
|
67
|
+
});
|
|
68
|
+
const { schema } = typeResponse.catalog_type;
|
|
69
|
+
const escalationAttr = schema.attributes.find((a) => a.type === "EscalationPath");
|
|
70
|
+
const scheduleAttr = schema.attributes.find((a) => a.type === "Schedule");
|
|
71
|
+
const entriesResponse = await IncidentApi.request({
|
|
72
|
+
path: `/v3/catalog_entries?catalog_type_id=${catalogTypeId}&identifier=${encodeURIComponent(entityExternalId)}&page_size=1`
|
|
73
|
+
});
|
|
74
|
+
const entry = entriesResponse.catalog_entries[0];
|
|
75
|
+
if (!entry) throw new Error(`No incident.io catalog entry found for ${entityExternalId}`);
|
|
76
|
+
const escalationPath = escalationAttr ? entry.attribute_values[escalationAttr.id]?.value ?? null : null;
|
|
77
|
+
const schedule = scheduleAttr ? entry.attribute_values[scheduleAttr.id]?.value ?? null : null;
|
|
78
|
+
let escalationPathStatus;
|
|
79
|
+
if (!escalationAttr) escalationPathStatus = "no_field";
|
|
80
|
+
else if (!escalationPath) escalationPathStatus = "empty";
|
|
81
|
+
else escalationPathStatus = "ok";
|
|
82
|
+
let scheduleStatus;
|
|
83
|
+
if (!scheduleAttr) scheduleStatus = "no_field";
|
|
84
|
+
else if (!schedule) scheduleStatus = "empty";
|
|
85
|
+
else scheduleStatus = "ok";
|
|
86
|
+
let currentlyOnCall = [];
|
|
87
|
+
if (schedule) {
|
|
88
|
+
const scheduleEntry = await IncidentApi.request({
|
|
89
|
+
path: `/v3/catalog_entries/${schedule.literal}`
|
|
90
|
+
});
|
|
91
|
+
currentlyOnCall = scheduleEntry.catalog_entry.attribute_values.currently_on_call?.array_value ?? [];
|
|
92
|
+
}
|
|
93
|
+
return { escalationPath, schedule, currentlyOnCall, escalationPathStatus, scheduleStatus };
|
|
94
|
+
}, deps);
|
|
95
|
+
};
|
|
96
|
+
const useAllEscalationPaths = (deps) => {
|
|
97
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
98
|
+
return useAsync(async () => {
|
|
99
|
+
const response = await IncidentApi.request({
|
|
100
|
+
path: `/v2/escalation_paths`
|
|
101
|
+
});
|
|
102
|
+
return response.escalation_paths;
|
|
103
|
+
}, deps);
|
|
104
|
+
};
|
|
105
|
+
const useAllSchedules = (deps) => {
|
|
106
|
+
const IncidentApi = useApi(IncidentApiRef);
|
|
107
|
+
return useAsync(async () => {
|
|
108
|
+
const response = await IncidentApi.request({
|
|
109
|
+
path: `/v2/schedules`
|
|
110
|
+
});
|
|
111
|
+
return response.schedules;
|
|
112
|
+
}, deps);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export { useAllEscalationPaths, useAllSchedules, useEscalationPath, useOnCallData, useSchedule };
|
|
116
|
+
//# sourceMappingURL=useOnCallRequest.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnCallRequest.esm.js","sources":["../../src/hooks/useOnCallRequest.ts"],"sourcesContent":["import { useApi, configApiRef } from \"@backstage/core-plugin-api\";\nimport { useAsync } from \"react-use\";\nimport { IncidentApiRef } from \"../api/client\";\nimport { components } from \"../api/types\";\nimport { DependencyList } from \"react\";\n\nexport type EscalationPathNode = components[\"schemas\"][\"EscalationPathNodeV2\"];\nexport type EscalationPathTarget = components[\"schemas\"][\"EscalationPathTargetV2\"];\nexport type EscalationPathData = components[\"schemas\"][\"EscalationPathV2\"];\nexport type ScheduleRotation = components[\"schemas\"][\"ScheduleRotationV2\"];\nexport type ScheduleData = components[\"schemas\"][\"ScheduleV2\"];\n\nconst collectSlackChannelIds = (nodes: EscalationPathNode[]): string[] => {\n const ids: string[] = [];\n for (const node of nodes) {\n const targets = node.level?.targets ?? node.notify_channel?.targets ?? [];\n for (const t of targets) {\n if (t.type === \"slack_channel\") ids.push(t.id);\n }\n if (node.if_else) {\n ids.push(...collectSlackChannelIds(node.if_else.then_path));\n ids.push(...collectSlackChannelIds(node.if_else.else_path));\n }\n }\n return [...new Set(ids)];\n};\n\nexport const useEscalationPath = (escalationPathId: string | null, deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n\n return useAsync(async () => {\n if (!escalationPathId) return null;\n const response = await IncidentApi.request<components[\"schemas\"][\"EscalationsShowPathResultV2\"]>({\n path: `/v2/escalation_paths/${escalationPathId}`,\n });\n const ep = response.escalation_path;\n\n const channelNames: Record<string, string> = {};\n const channelIds = collectSlackChannelIds(ep.path);\n if (channelIds.length > 0) {\n const typesResponse = await IncidentApi.request<components[\"schemas\"][\"CatalogListTypesResultV3\"]>({\n path: `/v3/catalog_types`,\n });\n const slackChannelType = typesResponse.catalog_types.find(t => t.type_name === \"SlackChannel\");\n if (slackChannelType) {\n const entriesResponse = await IncidentApi.request<components[\"schemas\"][\"CatalogListEntriesResultV3\"]>({\n path: `/v3/catalog_entries?catalog_type_id=${slackChannelType.id}&page_size=250`,\n });\n for (const entry of entriesResponse.catalog_entries) {\n for (const id of channelIds) {\n if (entry.aliases.includes(id)) {\n channelNames[id] = entry.name;\n }\n }\n }\n }\n }\n\n return { ep, channelNames };\n }, deps);\n};\n\nexport const useSchedule = (scheduleId: string | null, deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n\n return useAsync(async () => {\n if (!scheduleId) return null;\n const response = await IncidentApi.request<components[\"schemas\"][\"SchedulesShowResultV2\"]>({\n path: `/v2/schedules/${scheduleId}`,\n });\n return response.schedule;\n }, deps);\n};\n\n\nexport const useOnCallData = (entityExternalId: string, deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n const config = useApi(configApiRef);\n\n return useAsync(async () => {\n const catalogTypeId = config.getString(\"incident.onCall.catalogTypeId\");\n\n const typeResponse = await IncidentApi.request<components[\"schemas\"][\"CatalogShowTypeResultV3\"]>({\n path: `/v3/catalog_types/${catalogTypeId}`,\n });\n\n const { schema } = typeResponse.catalog_type;\n const escalationAttr = schema.attributes.find(a => a.type === 'EscalationPath');\n const scheduleAttr = schema.attributes.find(a => a.type === 'Schedule');\n\n const entriesResponse = await IncidentApi.request<components[\"schemas\"][\"CatalogListEntriesResultV3\"]>({\n path: `/v3/catalog_entries?catalog_type_id=${catalogTypeId}&identifier=${encodeURIComponent(entityExternalId)}&page_size=1`,\n });\n\n const entry = entriesResponse.catalog_entries[0];\n if (!entry) throw new Error(`No incident.io catalog entry found for ${entityExternalId}`);\n\n const escalationPath = escalationAttr ? entry.attribute_values[escalationAttr.id]?.value ?? null : null;\n const schedule = scheduleAttr ? entry.attribute_values[scheduleAttr.id]?.value ?? null : null;\n\n let escalationPathStatus: 'ok' | 'no_field' | 'empty';\n if (!escalationAttr) escalationPathStatus = 'no_field';\n else if (!escalationPath) escalationPathStatus = 'empty';\n else escalationPathStatus = 'ok';\n\n let scheduleStatus: 'ok' | 'no_field' | 'empty';\n if (!scheduleAttr) scheduleStatus = 'no_field';\n else if (!schedule) scheduleStatus = 'empty';\n else scheduleStatus = 'ok';\n\n let currentlyOnCall: NonNullable<components[\"schemas\"][\"CatalogEntryEngineParamBindingV3\"][\"array_value\"]> = [];\n if (schedule) {\n const scheduleEntry = await IncidentApi.request<components[\"schemas\"][\"CatalogShowEntryResultV3\"]>({\n path: `/v3/catalog_entries/${schedule.literal}`,\n });\n currentlyOnCall = scheduleEntry.catalog_entry.attribute_values.currently_on_call?.array_value ?? [];\n }\n\n return { escalationPath, schedule, currentlyOnCall, escalationPathStatus, scheduleStatus };\n }, deps);\n};\n\nexport const useAllEscalationPaths = (deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n return useAsync(async () => {\n const response = await IncidentApi.request<components[\"schemas\"][\"EscalationsListPathsResultV2\"]>({\n path: `/v2/escalation_paths`,\n });\n return response.escalation_paths;\n }, deps);\n};\n\nexport const useAllSchedules = (deps?: DependencyList) => {\n const IncidentApi = useApi(IncidentApiRef);\n return useAsync(async () => {\n const response = await IncidentApi.request<components[\"schemas\"][\"SchedulesListResultV2\"]>({\n path: `/v2/schedules`,\n });\n return response.schedules;\n }, deps);\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
import * as react from 'react';
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
2
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
4
3
|
import { CardExtensionProps } from '@backstage/plugin-home-react';
|
|
5
4
|
|
|
6
5
|
declare const incidentPlugin: _backstage_core_plugin_api.BackstagePlugin<{}, {}, {}>;
|
|
7
6
|
declare const EntityIncidentCard: ({ maxIncidents, }: {
|
|
8
|
-
maxIncidents?: number
|
|
9
|
-
}) =>
|
|
10
|
-
declare const
|
|
7
|
+
maxIncidents?: number;
|
|
8
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
9
|
+
declare const EntityAlertCard: () => react_jsx_runtime.JSX.Element;
|
|
10
|
+
declare const EntityOnCallCard: () => react_jsx_runtime.JSX.Element;
|
|
11
|
+
declare const HomePageOnCallCard: (props: CardExtensionProps<unknown>) => JSX.Element;
|
|
12
|
+
declare const HomePageAlertCard: (props: CardExtensionProps<unknown>) => JSX.Element;
|
|
13
|
+
declare const HomePageIncidentCard: (props: CardExtensionProps<unknown>) => JSX.Element;
|
|
11
14
|
|
|
12
|
-
export { EntityIncidentCard, HomePageIncidentCard, incidentPlugin };
|
|
15
|
+
export { EntityAlertCard, EntityIncidentCard, EntityOnCallCard, HomePageAlertCard, HomePageIncidentCard, HomePageOnCallCard, incidentPlugin };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,65 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { createCardExtension } from '@backstage/plugin-home-react';
|
|
3
|
-
import { I as IncidentApiRef, a as IncidentApi } from './esm/client-646572ea.esm.js';
|
|
4
|
-
|
|
5
|
-
const incidentPlugin = createPlugin({
|
|
6
|
-
id: "incident",
|
|
7
|
-
apis: [
|
|
8
|
-
createApiFactory({
|
|
9
|
-
api: IncidentApiRef,
|
|
10
|
-
deps: {
|
|
11
|
-
discoveryApi: discoveryApiRef,
|
|
12
|
-
fetchApi: fetchApiRef
|
|
13
|
-
},
|
|
14
|
-
factory: ({ discoveryApi, fetchApi }) => {
|
|
15
|
-
return new IncidentApi({
|
|
16
|
-
discoveryApi,
|
|
17
|
-
fetchApi
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
})
|
|
21
|
-
]
|
|
22
|
-
});
|
|
23
|
-
const EntityIncidentCard = incidentPlugin.provide(
|
|
24
|
-
createComponentExtension({
|
|
25
|
-
name: "EntityIncidentCard",
|
|
26
|
-
component: {
|
|
27
|
-
lazy: () => import('./esm/index-a220a8f7.esm.js').then(
|
|
28
|
-
(m) => m.EntityIncidentCard
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
})
|
|
32
|
-
);
|
|
33
|
-
const HomePageIncidentCard = incidentPlugin.provide(
|
|
34
|
-
createCardExtension({
|
|
35
|
-
name: "HomePageIncidentCard",
|
|
36
|
-
title: "Ongoing Incidents",
|
|
37
|
-
components: () => import('./esm/index-55bf4982.esm.js'),
|
|
38
|
-
settings: {
|
|
39
|
-
schema: {
|
|
40
|
-
type: "object",
|
|
41
|
-
properties: {
|
|
42
|
-
filterType: {
|
|
43
|
-
type: "string",
|
|
44
|
-
title: "Filter Type",
|
|
45
|
-
description: "Whether to filter on status category or status",
|
|
46
|
-
oneOf: [
|
|
47
|
-
{ enum: ["status_category"], title: "Status Category" },
|
|
48
|
-
{ enum: ["status"], title: "Status" }
|
|
49
|
-
],
|
|
50
|
-
default: "status_category"
|
|
51
|
-
},
|
|
52
|
-
filter: {
|
|
53
|
-
type: "string",
|
|
54
|
-
title: "Filter",
|
|
55
|
-
description: "The filter to use. This is a string that will be passed to the API.",
|
|
56
|
-
default: "active"
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
})
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
export { EntityIncidentCard, HomePageIncidentCard, incidentPlugin };
|
|
1
|
+
export { EntityAlertCard, EntityIncidentCard, EntityOnCallCard, HomePageAlertCard, HomePageIncidentCard, HomePageOnCallCard, incidentPlugin } from './plugin.esm.js';
|
|
65
2
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createPlugin, createApiFactory, fetchApiRef, discoveryApiRef, createComponentExtension } from '@backstage/core-plugin-api';
|
|
2
|
+
import { createCardExtension } from '@backstage/plugin-home-react';
|
|
3
|
+
import { IncidentApiRef, IncidentApi } from './api/client.esm.js';
|
|
4
|
+
|
|
5
|
+
const incidentPlugin = createPlugin({
|
|
6
|
+
id: "incident",
|
|
7
|
+
apis: [
|
|
8
|
+
createApiFactory({
|
|
9
|
+
api: IncidentApiRef,
|
|
10
|
+
deps: {
|
|
11
|
+
discoveryApi: discoveryApiRef,
|
|
12
|
+
fetchApi: fetchApiRef
|
|
13
|
+
},
|
|
14
|
+
factory: ({ discoveryApi, fetchApi }) => {
|
|
15
|
+
return new IncidentApi({
|
|
16
|
+
discoveryApi,
|
|
17
|
+
fetchApi
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
]
|
|
22
|
+
});
|
|
23
|
+
const EntityIncidentCard = incidentPlugin.provide(
|
|
24
|
+
createComponentExtension({
|
|
25
|
+
name: "EntityIncidentCard",
|
|
26
|
+
component: {
|
|
27
|
+
lazy: () => import('./components/EntityIncidentCard/index.esm.js').then(
|
|
28
|
+
(m) => m.EntityIncidentCard
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
const EntityAlertCard = incidentPlugin.provide(
|
|
34
|
+
createComponentExtension({
|
|
35
|
+
name: "EntityAlertCard",
|
|
36
|
+
component: {
|
|
37
|
+
lazy: () => import('./components/EntityAlertCard/index.esm.js').then(
|
|
38
|
+
(m) => m.EntityAlertCard
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
const EntityOnCallCard = incidentPlugin.provide(
|
|
44
|
+
createComponentExtension({
|
|
45
|
+
name: "EntityOnCallCard",
|
|
46
|
+
component: {
|
|
47
|
+
lazy: () => import('./components/EntityOnCallCard/index.esm.js').then(
|
|
48
|
+
(m) => m.EntityOnCallCard
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
const HomePageOnCallCard = incidentPlugin.provide(
|
|
54
|
+
createCardExtension({
|
|
55
|
+
name: "HomePageOnCallCard",
|
|
56
|
+
title: "On-call",
|
|
57
|
+
components: () => import('./components/HomePageOnCallCard/index.esm.js')
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
const HomePageAlertCard = incidentPlugin.provide(
|
|
61
|
+
createCardExtension({
|
|
62
|
+
name: "HomePageAlertCard",
|
|
63
|
+
title: "Firing Alerts",
|
|
64
|
+
components: () => import('./components/HomePageAlertCard/index.esm.js')
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
const HomePageIncidentCard = incidentPlugin.provide(
|
|
68
|
+
createCardExtension({
|
|
69
|
+
name: "HomePageIncidentCard",
|
|
70
|
+
title: "Ongoing Incidents",
|
|
71
|
+
components: () => import('./components/HomePageIncidentCard/index.esm.js'),
|
|
72
|
+
settings: {
|
|
73
|
+
schema: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
filterType: {
|
|
77
|
+
type: "string",
|
|
78
|
+
title: "Filter Type",
|
|
79
|
+
description: "Whether to filter on status category or status",
|
|
80
|
+
oneOf: [
|
|
81
|
+
{ enum: ["status_category"], title: "Status Category" },
|
|
82
|
+
{ enum: ["status"], title: "Status" }
|
|
83
|
+
],
|
|
84
|
+
default: "status_category"
|
|
85
|
+
},
|
|
86
|
+
filter: {
|
|
87
|
+
type: "string",
|
|
88
|
+
title: "Filter",
|
|
89
|
+
description: "The filter to use. This is a string that will be passed to the API.",
|
|
90
|
+
default: "active"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
export { EntityAlertCard, EntityIncidentCard, EntityOnCallCard, HomePageAlertCard, HomePageIncidentCard, HomePageOnCallCard, incidentPlugin };
|
|
99
|
+
//# sourceMappingURL=plugin.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 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 createApiFactory,\n createComponentExtension,\n createPlugin,\n discoveryApiRef,\n fetchApiRef,\n} from \"@backstage/core-plugin-api\";\nimport {\n CardExtensionProps,\n createCardExtension,\n} from \"@backstage/plugin-home-react\";\n\nimport { IncidentApi, IncidentApiRef } from \"./api/client\";\n\nexport const incidentPlugin = createPlugin({\n id: \"incident\",\n apis: [\n createApiFactory({\n api: IncidentApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, fetchApi }) => {\n return new IncidentApi({\n discoveryApi: discoveryApi,\n fetchApi: fetchApi,\n });\n },\n }),\n ],\n});\n\nexport const EntityIncidentCard = incidentPlugin.provide(\n createComponentExtension({\n name: \"EntityIncidentCard\",\n component: {\n lazy: () =>\n import(\"./components/EntityIncidentCard\").then(\n (m) => m.EntityIncidentCard,\n ),\n },\n }),\n);\n\nexport const EntityAlertCard = incidentPlugin.provide(\n createComponentExtension({\n name: \"EntityAlertCard\",\n component: {\n lazy: () =>\n import(\"./components/EntityAlertCard\").then(\n (m) => m.EntityAlertCard,\n ),\n },\n }),\n);\n\nexport const EntityOnCallCard = incidentPlugin.provide(\n createComponentExtension({\n name: \"EntityOnCallCard\",\n component: {\n lazy: () =>\n import(\"./components/EntityOnCallCard\").then(\n (m) => m.EntityOnCallCard,\n ),\n },\n }),\n);\n\nexport const HomePageOnCallCard: (\n props: CardExtensionProps<unknown>,\n) => JSX.Element = incidentPlugin.provide(\n createCardExtension({\n name: \"HomePageOnCallCard\",\n title: \"On-call\",\n components: () => import(\"./components/HomePageOnCallCard\"),\n }),\n);\n\nexport const HomePageAlertCard: (\n props: CardExtensionProps<unknown>,\n) => JSX.Element = incidentPlugin.provide(\n createCardExtension({\n name: \"HomePageAlertCard\",\n title: \"Firing Alerts\",\n components: () => import(\"./components/HomePageAlertCard\"),\n }),\n);\n\nexport const HomePageIncidentCard: (\n props: CardExtensionProps<unknown>,\n) => JSX.Element = incidentPlugin.provide(\n createCardExtension({\n name: \"HomePageIncidentCard\",\n title: \"Ongoing Incidents\",\n components: () => import(\"./components/HomePageIncidentCard\"),\n settings: {\n schema: {\n type: \"object\",\n properties: {\n filterType: {\n type: \"string\",\n title: \"Filter Type\",\n description: \"Whether to filter on status category or status\",\n oneOf: [\n { enum: [\"status_category\"], title: \"Status Category\" },\n { enum: [\"status\"], title: \"Status\" },\n ],\n default: \"status_category\",\n },\n filter: {\n type: \"string\",\n title: \"Filter\",\n description:\n \"The filter to use. This is a string that will be passed to the API.\",\n default: \"active\",\n },\n },\n },\n },\n }),\n);\n"],"names":[],"mappings":";;;;AA6BO,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,UAAS,KAAM;AACvC,QAAA,OAAO,IAAI,WAAA,CAAY;AAAA,UACrB,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACD;AAAA;AAEL,CAAC;AAEM,MAAM,qBAAqB,cAAA,CAAe,OAAA;AAAA,EAC/C,wBAAA,CAAyB;AAAA,IACvB,IAAA,EAAM,oBAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,8CAAiC,CAAA,CAAE,IAAA;AAAA,QACxC,CAAC,MAAM,CAAA,CAAE;AAAA;AACX;AACJ,GACD;AACH;AAEO,MAAM,kBAAkB,cAAA,CAAe,OAAA;AAAA,EAC5C,wBAAA,CAAyB;AAAA,IACvB,IAAA,EAAM,iBAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,2CAA8B,CAAA,CAAE,IAAA;AAAA,QACrC,CAAC,MAAM,CAAA,CAAE;AAAA;AACX;AACJ,GACD;AACH;AAEO,MAAM,mBAAmB,cAAA,CAAe,OAAA;AAAA,EAC7C,wBAAA,CAAyB;AAAA,IACvB,IAAA,EAAM,kBAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,4CAA+B,CAAA,CAAE,IAAA;AAAA,QACtC,CAAC,MAAM,CAAA,CAAE;AAAA;AACX;AACJ,GACD;AACH;AAEO,MAAM,qBAEM,cAAA,CAAe,OAAA;AAAA,EAChC,mBAAA,CAAoB;AAAA,IAClB,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,MAAM,OAAO,8CAAiC;AAAA,GAC3D;AACH;AAEO,MAAM,oBAEM,cAAA,CAAe,OAAA;AAAA,EAChC,mBAAA,CAAoB;AAAA,IAClB,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO,eAAA;AAAA,IACP,UAAA,EAAY,MAAM,OAAO,6CAAgC;AAAA,GAC1D;AACH;AAEO,MAAM,uBAEM,cAAA,CAAe,OAAA;AAAA,EAChC,mBAAA,CAAoB;AAAA,IAClB,IAAA,EAAM,sBAAA;AAAA,IACN,KAAA,EAAO,mBAAA;AAAA,IACP,UAAA,EAAY,MAAM,OAAO,gDAAmC,CAAA;AAAA,IAC5D,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,aAAA;AAAA,YACP,WAAA,EAAa,gDAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,EAAE,IAAA,EAAM,CAAC,iBAAiB,CAAA,EAAG,OAAO,iBAAA,EAAkB;AAAA,cACtD,EAAE,IAAA,EAAM,CAAC,QAAQ,CAAA,EAAG,OAAO,QAAA;AAAS,aACtC;AAAA,YACA,OAAA,EAAS;AAAA,WACX;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,QAAA;AAAA,YACP,WAAA,EACE,qEAAA;AAAA,YACF,OAAA,EAAS;AAAA;AACX;AACF;AACF;AACF,GACD;AACH;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@incident-io/backstage",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"main": "dist/index.esm.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -10,12 +10,23 @@
|
|
|
10
10
|
"default": "./dist/index.esm.js"
|
|
11
11
|
},
|
|
12
12
|
"./alpha": {
|
|
13
|
+
"backstage": "@backstage/FrontendPlugin",
|
|
13
14
|
"import": "./dist/alpha.esm.js",
|
|
14
15
|
"types": "./dist/alpha.d.ts",
|
|
15
16
|
"default": "./dist/alpha.esm.js"
|
|
16
17
|
},
|
|
17
18
|
"./package.json": "./package.json"
|
|
18
19
|
},
|
|
20
|
+
"typesVersions": {
|
|
21
|
+
"*": {
|
|
22
|
+
"alpha": [
|
|
23
|
+
"dist/alpha.d.ts"
|
|
24
|
+
],
|
|
25
|
+
"package.json": [
|
|
26
|
+
"package.json"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
19
30
|
"license": "Apache-2.0",
|
|
20
31
|
"publishConfig": {
|
|
21
32
|
"access": "public",
|
|
@@ -27,36 +38,39 @@
|
|
|
27
38
|
"role": "frontend-plugin",
|
|
28
39
|
"pluginPackages": [
|
|
29
40
|
"@incident-io/backstage"
|
|
30
|
-
]
|
|
41
|
+
],
|
|
42
|
+
"features": {
|
|
43
|
+
"./alpha": "@backstage/FrontendPlugin"
|
|
44
|
+
}
|
|
31
45
|
},
|
|
32
46
|
"configSchema": "config.d.ts",
|
|
33
47
|
"sideEffects": false,
|
|
34
48
|
"scripts": {
|
|
35
49
|
"start": "backstage-cli package start",
|
|
36
50
|
"build": "npx tsc && backstage-cli package build",
|
|
37
|
-
"lint": "backstage-cli package lint",
|
|
38
|
-
"test": "
|
|
51
|
+
"lint": "backstage-cli package lint --max-warnings 0",
|
|
52
|
+
"test": "vitest",
|
|
39
53
|
"clean": "backstage-cli package clean",
|
|
40
54
|
"prepack": "backstage-cli package prepack",
|
|
41
55
|
"postpack": "backstage-cli package postpack",
|
|
42
56
|
"prettier": "npx prettier . --write"
|
|
43
57
|
},
|
|
44
58
|
"dependencies": {
|
|
45
|
-
"@backstage/catalog-model": "^1.
|
|
59
|
+
"@backstage/catalog-model": "^1.7.7",
|
|
46
60
|
"@backstage/core-components": "^0.18.8",
|
|
47
|
-
"@backstage/core-plugin-api": "
|
|
48
|
-
"@backstage/errors": "^1.2.
|
|
61
|
+
"@backstage/core-plugin-api": "^1.11.1",
|
|
62
|
+
"@backstage/errors": "^1.2.7",
|
|
63
|
+
"@backstage/frontend-plugin-api": "^0.15.1",
|
|
49
64
|
"@backstage/plugin-catalog-react": "^2.1.1",
|
|
50
65
|
"@backstage/plugin-home-react": "^0.1.36",
|
|
51
66
|
"@backstage/plugin-search-react": "^1.11.0",
|
|
52
|
-
"@backstage/theme": "
|
|
67
|
+
"@backstage/theme": "^0.7.0",
|
|
53
68
|
"@material-ui/core": "^4.9.13",
|
|
54
69
|
"@material-ui/icons": "^4.9.1",
|
|
55
70
|
"@material-ui/lab": "^4.0.0-alpha.60",
|
|
56
71
|
"luxon": "^3.3.0",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"react-use": "^17.2.4"
|
|
72
|
+
"qs": "^6.14.2",
|
|
73
|
+
"react-use": "^17.6.0"
|
|
60
74
|
},
|
|
61
75
|
"peerDependencies": {
|
|
62
76
|
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
@@ -65,25 +79,32 @@
|
|
|
65
79
|
"react-router-dom": "^6.0.0"
|
|
66
80
|
},
|
|
67
81
|
"devDependencies": {
|
|
68
|
-
"@backstage/cli": "^0.
|
|
69
|
-
"@backstage/
|
|
70
|
-
"@backstage/
|
|
71
|
-
"@backstage/
|
|
72
|
-
"@
|
|
82
|
+
"@backstage/cli": "^0.36.0",
|
|
83
|
+
"@backstage/cli-defaults": "^0.1.0",
|
|
84
|
+
"@backstage/core-app-api": "^1.19.6",
|
|
85
|
+
"@backstage/dev-utils": "^1.1.21",
|
|
86
|
+
"@backstage/test-utils": "^1.7.16",
|
|
87
|
+
"@testing-library/dom": "^10.4.1",
|
|
88
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
73
89
|
"@testing-library/react": "^16.0.0",
|
|
74
|
-
"@testing-library/user-event": "^14.
|
|
90
|
+
"@testing-library/user-event": "^14.6.1",
|
|
75
91
|
"@types/luxon": "^3.7.1",
|
|
76
92
|
"@types/node": "*",
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
93
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
94
|
+
"@vitest/ui": "^2.1.9",
|
|
95
|
+
"cross-fetch": "^4.1.0",
|
|
96
|
+
"jsdom": "^29.0.2",
|
|
97
|
+
"msw": "^2.13.2",
|
|
98
|
+
"prettier": "3.8.1",
|
|
99
|
+
"react": "^18.0.0",
|
|
100
|
+
"react-dom": "^18.0.0",
|
|
101
|
+
"react-router-dom": "^6.0.0",
|
|
102
|
+
"vitest": "^4.1.4"
|
|
81
103
|
},
|
|
82
104
|
"files": [
|
|
83
105
|
"config.d.ts",
|
|
84
106
|
"dist",
|
|
85
|
-
"src"
|
|
86
|
-
"alpha"
|
|
107
|
+
"src"
|
|
87
108
|
],
|
|
88
109
|
"repository": {
|
|
89
110
|
"type": "git",
|