@pagerduty/backstage-plugin 0.12.2 → 0.13.0-next.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/dist/api/client.esm.js +24 -0
- package/dist/api/client.esm.js.map +1 -1
- package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js +247 -0
- package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js.map +1 -0
- package/dist/components/PagerDutyPage/index.esm.js +11 -0
- package/dist/components/PagerDutyPage/index.esm.js.map +1 -0
- package/dist/hooks/index.esm.js +2 -0
- package/dist/hooks/index.esm.js.map +1 -1
- package/dist/index.d.ts +23 -10
- package/dist/index.esm.js +1 -1
- package/dist/plugin.esm.js +10 -3
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +12 -6
package/dist/api/client.esm.js
CHANGED
|
@@ -45,6 +45,30 @@ class PagerDutyClient {
|
|
|
45
45
|
}
|
|
46
46
|
return response;
|
|
47
47
|
}
|
|
48
|
+
async getEntityMappings() {
|
|
49
|
+
const url = `${await this.config.discoveryApi.getBaseUrl(
|
|
50
|
+
"pagerduty"
|
|
51
|
+
)}/mapping/entity`;
|
|
52
|
+
return await this.findByUrl(url);
|
|
53
|
+
}
|
|
54
|
+
async storeServiceMapping(serviceId, backstageEntityId) {
|
|
55
|
+
const body = JSON.stringify({
|
|
56
|
+
entityRef: backstageEntityId,
|
|
57
|
+
serviceId
|
|
58
|
+
});
|
|
59
|
+
const options = {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: {
|
|
62
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
63
|
+
Accept: "application/json, text/plain, */*"
|
|
64
|
+
},
|
|
65
|
+
body
|
|
66
|
+
};
|
|
67
|
+
const url = `${await this.config.discoveryApi.getBaseUrl(
|
|
68
|
+
"pagerduty"
|
|
69
|
+
)}/mapping/entity`;
|
|
70
|
+
return this.request(url, options);
|
|
71
|
+
}
|
|
48
72
|
async getServiceByEntity(entity) {
|
|
49
73
|
return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));
|
|
50
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.esm.js","sources":["../../src/api/client.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\n\nimport {\n PagerDutyApi,\n PagerDutyTriggerAlarmRequest,\n PagerDutyClientApiDependencies,\n PagerDutyClientApiConfig,\n RequestOptions,\n} from './types';\nimport { PagerDutyChangeEventsResponse, \n PagerDutyOnCallUsersResponse, \n PagerDutyUser, \n PagerDutyServiceResponse,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse\n} from '@pagerduty/backstage-plugin-common';\nimport { createApiRef, ConfigApi } from '@backstage/core-plugin-api';\nimport { NotFoundError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\nimport { PagerDutyEntity } from '../types';\n\n/** @public */\nexport class UnauthorizedError extends Error {}\n\n/** @public */\nexport class ForbiddenError extends Error { }\n\n/** @public */\nexport const pagerDutyApiRef = createApiRef<PagerDutyApi>({\n id: 'plugin.pagerduty.api',\n});\n\n/** @public */\nexport class PagerDutyClient implements PagerDutyApi {\n static fromConfig(\n configApi: ConfigApi,\n dependencies: PagerDutyClientApiDependencies,\n ) {\n const { discoveryApi, fetchApi } = dependencies;\n\n const eventsBaseUrl: string =\n configApi.getOptionalString('pagerDuty.eventsBaseUrl') ??\n 'https://events.pagerduty.com/v2';\n\n return new PagerDutyClient({\n eventsBaseUrl,\n discoveryApi,\n fetchApi,\n });\n }\n\n constructor(private readonly config: PagerDutyClientApiConfig) {}\n\n async getServiceByPagerDutyEntity(\n pagerDutyEntity: PagerDutyEntity,\n ): Promise<PagerDutyServiceResponse> {\n const { integrationKey, serviceId } = pagerDutyEntity;\n\n let response: PagerDutyServiceResponse;\n let url: string;\n\n if (integrationKey) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services?integration_key=${integrationKey}`;\n const serviceResponse = await this.findByUrl<PagerDutyServiceResponse>(url);\n\n if (serviceResponse.service === undefined) throw new NotFoundError();\n\n response = serviceResponse;\n } else if (serviceId) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n response = await this.findByUrl<PagerDutyServiceResponse>(url);\n } else {\n throw new NotFoundError();\n }\n\n return response;\n }\n\n async getServiceByEntity(entity: Entity): Promise<PagerDutyServiceResponse> {\n return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));\n }\n\n async getServiceById(serviceId: string): Promise<PagerDutyServiceResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n return await this.findByUrl<PagerDutyServiceResponse>(url);\n }\n\n async getIncidentsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyIncidentsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/incidents`;\n\n return await this.findByUrl<PagerDutyIncidentsResponse>(url);\n }\n\n async getChangeEventsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyChangeEventsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/change-events`;\n\n return await this.findByUrl<PagerDutyChangeEventsResponse>(url);\n }\n\n async getServiceStandardsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyServiceStandardsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/standards`;\n\n return await this.findByUrl<PagerDutyServiceStandardsResponse>(url);\n }\n\n async getServiceMetricsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyServiceMetricsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/metrics`;\n\n return await this.findByUrl<PagerDutyServiceMetricsResponse>(url);\n }\n\n async getOnCallByPolicyId(\n policyId: string,\n ): Promise<PagerDutyUser[]> {\n const params = `escalation_policy_ids[]=${policyId}`;\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/oncall-users?${params}`;\n\n const response: PagerDutyOnCallUsersResponse = await this.findByUrl<PagerDutyOnCallUsersResponse>(url);\n return response.users;\n }\n\n triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise<Response> {\n const { integrationKey, source, description, userName } = request;\n\n const body = JSON.stringify({\n event_action: 'trigger',\n routing_key: integrationKey,\n client: 'Backstage',\n client_url: source,\n payload: {\n summary: description,\n source: source,\n severity: 'error',\n class: 'manual trigger',\n custom_details: {\n user: userName,\n },\n },\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = this.config.eventsBaseUrl ?? 'https://events.pagerduty.com/v2';\n\n return this.request(`${url}/enqueue`, options);\n }\n\n private async findByUrl<T>(url: string): Promise<T> {\n const options = {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const response = await this.request(url, options);\n return response.json();\n }\n\n private async request(\n url: string,\n options: RequestOptions,\n ): Promise<Response> {\n const response = await this.config.fetchApi.fetch(url, options);\n if (response.status === 401) {\n throw new UnauthorizedError(\"Unauthorized: You don't have access to this resource\");\n }\n\n if (response.status === 403) {\n throw new ForbiddenError(\"Forbidden: You are not allowed to perform this action\");\n }\n\n if (response.status === 404) {\n throw new NotFoundError(\"Not Found: Resource not found\");\n }\n\n if (!response.ok) {\n const payload = await response.json();\n const errors = payload.errors.map((error: string) => error).join(' ');\n const message = `Request failed with ${response.status}, ${errors}`;\n throw new Error(message);\n }\n return response;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.esm.js","sources":["../../src/api/client.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\n\nimport {\n PagerDutyApi,\n PagerDutyTriggerAlarmRequest,\n PagerDutyClientApiDependencies,\n PagerDutyClientApiConfig,\n RequestOptions,\n} from './types';\nimport { PagerDutyChangeEventsResponse, \n PagerDutyOnCallUsersResponse, \n PagerDutyUser, \n PagerDutyServiceResponse,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyEntityMappingResponse\n} from '@pagerduty/backstage-plugin-common';\nimport { createApiRef, ConfigApi } from '@backstage/core-plugin-api';\nimport { NotFoundError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\nimport { PagerDutyEntity } from '../types';\n\n/** @public */\nexport class UnauthorizedError extends Error {}\n\n/** @public */\nexport class ForbiddenError extends Error { }\n\n/** @public */\nexport const pagerDutyApiRef = createApiRef<PagerDutyApi>({\n id: 'plugin.pagerduty.api',\n});\n\n/** @public */\nexport class PagerDutyClient implements PagerDutyApi {\n static fromConfig(\n configApi: ConfigApi,\n dependencies: PagerDutyClientApiDependencies,\n ) {\n const { discoveryApi, fetchApi } = dependencies;\n\n const eventsBaseUrl: string =\n configApi.getOptionalString('pagerDuty.eventsBaseUrl') ??\n 'https://events.pagerduty.com/v2';\n\n return new PagerDutyClient({\n eventsBaseUrl,\n discoveryApi,\n fetchApi,\n });\n }\n\n constructor(private readonly config: PagerDutyClientApiConfig) {}\n\n async getServiceByPagerDutyEntity(\n pagerDutyEntity: PagerDutyEntity,\n ): Promise<PagerDutyServiceResponse> {\n const { integrationKey, serviceId } = pagerDutyEntity;\n\n let response: PagerDutyServiceResponse;\n let url: string;\n\n if (integrationKey) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services?integration_key=${integrationKey}`;\n const serviceResponse = await this.findByUrl<PagerDutyServiceResponse>(url);\n\n if (serviceResponse.service === undefined) throw new NotFoundError();\n\n response = serviceResponse;\n } else if (serviceId) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n response = await this.findByUrl<PagerDutyServiceResponse>(url);\n } else {\n throw new NotFoundError();\n }\n\n return response;\n }\n\n async getEntityMappings(): Promise<PagerDutyEntityMappingResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return await this.findByUrl<PagerDutyEntityMappingResponse>(url);\n }\n\n async storeServiceMapping(serviceId: string, backstageEntityId: string): Promise<Response> {\n\n const body = JSON.stringify({\n entityRef: backstageEntityId,\n serviceId: serviceId,\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return this.request(url, options);\n }\n\n async getServiceByEntity(entity: Entity): Promise<PagerDutyServiceResponse> {\n return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));\n }\n\n async getServiceById(serviceId: string): Promise<PagerDutyServiceResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n return await this.findByUrl<PagerDutyServiceResponse>(url);\n }\n\n async getIncidentsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyIncidentsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/incidents`;\n\n return await this.findByUrl<PagerDutyIncidentsResponse>(url);\n }\n\n async getChangeEventsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyChangeEventsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/change-events`;\n\n return await this.findByUrl<PagerDutyChangeEventsResponse>(url);\n }\n\n async getServiceStandardsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyServiceStandardsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/standards`;\n\n return await this.findByUrl<PagerDutyServiceStandardsResponse>(url);\n }\n\n async getServiceMetricsByServiceId(\n serviceId: string,\n ): Promise<PagerDutyServiceMetricsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/metrics`;\n\n return await this.findByUrl<PagerDutyServiceMetricsResponse>(url);\n }\n\n async getOnCallByPolicyId(\n policyId: string,\n ): Promise<PagerDutyUser[]> {\n const params = `escalation_policy_ids[]=${policyId}`;\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/oncall-users?${params}`;\n\n const response: PagerDutyOnCallUsersResponse = await this.findByUrl<PagerDutyOnCallUsersResponse>(url);\n return response.users;\n }\n\n triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise<Response> {\n const { integrationKey, source, description, userName } = request;\n\n const body = JSON.stringify({\n event_action: 'trigger',\n routing_key: integrationKey,\n client: 'Backstage',\n client_url: source,\n payload: {\n summary: description,\n source: source,\n severity: 'error',\n class: 'manual trigger',\n custom_details: {\n user: userName,\n },\n },\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = this.config.eventsBaseUrl ?? 'https://events.pagerduty.com/v2';\n\n return this.request(`${url}/enqueue`, options);\n }\n\n private async findByUrl<T>(url: string): Promise<T> {\n const options = {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const response = await this.request(url, options);\n return response.json();\n }\n\n private async request(\n url: string,\n options: RequestOptions,\n ): Promise<Response> {\n const response = await this.config.fetchApi.fetch(url, options);\n if (response.status === 401) {\n throw new UnauthorizedError(\"Unauthorized: You don't have access to this resource\");\n }\n\n if (response.status === 403) {\n throw new ForbiddenError(\"Forbidden: You are not allowed to perform this action\");\n }\n\n if (response.status === 404) {\n throw new NotFoundError(\"Not Found: Resource not found\");\n }\n\n if (!response.ok) {\n const payload = await response.json();\n const errors = payload.errors.map((error: string) => error).join(' ');\n const message = `Request failed with ${response.status}, ${errors}`;\n throw new Error(message);\n }\n return response;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import React, { useState, useMemo } from 'react';
|
|
2
|
+
import { Typography, Box, DialogTitle, DialogContent, DialogActions, Tooltip, IconButton } from '@material-ui/core';
|
|
3
|
+
import EditIcon from '@mui/icons-material/Edit';
|
|
4
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
+
import { pagerDutyApiRef } from '../../api/client.esm.js';
|
|
6
|
+
import { QueryClient, QueryClientProvider, useQuery, useMutation } from '@tanstack/react-query';
|
|
7
|
+
import { useMaterialReactTable, MRT_EditActionButtons, MaterialReactTable } from 'material-react-table';
|
|
8
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
9
|
+
import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';
|
|
10
|
+
|
|
11
|
+
function getColorFromStatus(status) {
|
|
12
|
+
switch (status) {
|
|
13
|
+
case "InSync":
|
|
14
|
+
return "green";
|
|
15
|
+
case "OutOfSync":
|
|
16
|
+
return "red";
|
|
17
|
+
case "NotMapped":
|
|
18
|
+
return "orange";
|
|
19
|
+
default:
|
|
20
|
+
return "gray";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function makeReadable(status) {
|
|
24
|
+
switch (status) {
|
|
25
|
+
case "InSync":
|
|
26
|
+
return "In Sync";
|
|
27
|
+
case "OutOfSync":
|
|
28
|
+
return "Out of Sync";
|
|
29
|
+
case "NotMapped":
|
|
30
|
+
return "Not Mapped";
|
|
31
|
+
default:
|
|
32
|
+
return "Refresh to Update";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const ServiceMappingComponent = () => {
|
|
36
|
+
const [_, setEntityMappings] = useState([]);
|
|
37
|
+
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
38
|
+
const catalogApi = useApi(catalogApiRef);
|
|
39
|
+
function useGetMappings() {
|
|
40
|
+
return useQuery({
|
|
41
|
+
queryKey: ["mappings"],
|
|
42
|
+
queryFn: async () => {
|
|
43
|
+
const { mappings: foundMappings } = await pagerDutyApi.getEntityMappings();
|
|
44
|
+
setEntityMappings(foundMappings);
|
|
45
|
+
return foundMappings;
|
|
46
|
+
},
|
|
47
|
+
refetchOnWindowFocus: false
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function useGetCatalogEntities() {
|
|
51
|
+
return useQuery({
|
|
52
|
+
queryKey: ["catalogEntities"],
|
|
53
|
+
queryFn: async () => {
|
|
54
|
+
const result = await catalogApi.getEntities({
|
|
55
|
+
filter: { kind: "Component" }
|
|
56
|
+
});
|
|
57
|
+
const entities = [];
|
|
58
|
+
result.items.forEach((entity) => {
|
|
59
|
+
var _a, _b, _c, _d, _e, _f;
|
|
60
|
+
entities.push({
|
|
61
|
+
name: (_a = entity.metadata) == null ? void 0 : _a.name,
|
|
62
|
+
id: (_c = (_b = entity.metadata) == null ? void 0 : _b.uid) != null ? _c : "",
|
|
63
|
+
system: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.system) || "",
|
|
64
|
+
owner: JSON.stringify((_e = entity.spec) == null ? void 0 : _e.owner) || "",
|
|
65
|
+
lifecycle: JSON.stringify((_f = entity.spec) == null ? void 0 : _f.lifecycle) || ""
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
return entities;
|
|
69
|
+
},
|
|
70
|
+
refetchOnMount: false,
|
|
71
|
+
refetchOnWindowFocus: false
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function useUpdateMapping() {
|
|
75
|
+
return useMutation({
|
|
76
|
+
mutationFn: async (mapping) => {
|
|
77
|
+
return await pagerDutyApi.storeServiceMapping(
|
|
78
|
+
mapping.serviceId,
|
|
79
|
+
mapping.entityRef
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
// client side optimistic update
|
|
83
|
+
// onMutate: (newMappingInfo: PagerDutyEntityMapping) => {
|
|
84
|
+
// queryClient.setQueryData(["updateMappings"], (prevMappings: any) =>
|
|
85
|
+
// prevMappings?.map((prevMapping: PagerDutyEntityMapping) => {
|
|
86
|
+
// if (prevMapping.serviceId === newMappingInfo.serviceId) {
|
|
87
|
+
// newMappingInfo.entityName =
|
|
88
|
+
// fetchedCatalogEntities.find(
|
|
89
|
+
// (entity) => entity.id === newMappingInfo.entityRef
|
|
90
|
+
// )?.name || "";
|
|
91
|
+
// return newMappingInfo;
|
|
92
|
+
// }
|
|
93
|
+
// return prevMapping;
|
|
94
|
+
// })
|
|
95
|
+
// );
|
|
96
|
+
// },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const DenseTable = () => {
|
|
100
|
+
const [validationErrors, setValidationErrors] = useState({});
|
|
101
|
+
const columns = useMemo(
|
|
102
|
+
() => [
|
|
103
|
+
{
|
|
104
|
+
accessorKey: "serviceId",
|
|
105
|
+
header: "Service ID",
|
|
106
|
+
visibleInShowHideMenu: false,
|
|
107
|
+
enableEditing: false,
|
|
108
|
+
Edit: () => null,
|
|
109
|
+
Cell: ({ cell }) => /* @__PURE__ */ React.createElement(Typography, { variant: "body1", style: { fontWeight: 600 } }, cell.getValue())
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
accessorKey: "serviceName",
|
|
113
|
+
header: "PagerDuty Service",
|
|
114
|
+
enableEditing: false
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
accessorKey: "team",
|
|
118
|
+
header: "Team",
|
|
119
|
+
enableEditing: false
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
accessorKey: "escalationPolicy",
|
|
123
|
+
header: "Escalation Policy",
|
|
124
|
+
enableEditing: false
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
accessorKey: "entityRef",
|
|
128
|
+
header: "Mapping",
|
|
129
|
+
visibleInShowHideMenu: false,
|
|
130
|
+
editVariant: "select",
|
|
131
|
+
editSelectOptions: [],
|
|
132
|
+
// getCatalogEntityOptions(),
|
|
133
|
+
muiEditTextFieldProps: {
|
|
134
|
+
select: true,
|
|
135
|
+
error: !!(validationErrors == null ? void 0 : validationErrors.state),
|
|
136
|
+
helperText: validationErrors == null ? void 0 : validationErrors.state
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
accessorKey: "entityName",
|
|
141
|
+
header: "Mapped Entity Name",
|
|
142
|
+
enableEditing: false,
|
|
143
|
+
Edit: () => null
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
accessorKey: "status",
|
|
147
|
+
header: "Status",
|
|
148
|
+
enableEditing: false,
|
|
149
|
+
Edit: () => null,
|
|
150
|
+
Cell: ({ cell }) => /* @__PURE__ */ React.createElement(
|
|
151
|
+
Box,
|
|
152
|
+
{
|
|
153
|
+
component: "span",
|
|
154
|
+
bgcolor: getColorFromStatus(cell.getValue()),
|
|
155
|
+
borderRadius: "0.25rem",
|
|
156
|
+
color: "white",
|
|
157
|
+
p: "0.25rem"
|
|
158
|
+
},
|
|
159
|
+
makeReadable(cell.getValue())
|
|
160
|
+
)
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
accessorKey: "serviceUrl",
|
|
164
|
+
header: "Service URL",
|
|
165
|
+
visibleInShowHideMenu: false,
|
|
166
|
+
enableEditing: false,
|
|
167
|
+
Edit: () => null
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
[validationErrors]
|
|
171
|
+
);
|
|
172
|
+
const {
|
|
173
|
+
data: fetchedMappings = [],
|
|
174
|
+
isError: isLoadingMappingsError,
|
|
175
|
+
isFetching: isFetchingMappings,
|
|
176
|
+
isLoading: isLoadingMappings
|
|
177
|
+
} = useGetMappings();
|
|
178
|
+
const {
|
|
179
|
+
data: fetchedCatalogEntities = [],
|
|
180
|
+
isError: isLoadingCatalogEntitiesError,
|
|
181
|
+
isFetching: isFetchingCatalogEntities,
|
|
182
|
+
isLoading: isLoadingCatalogEntities
|
|
183
|
+
} = useGetCatalogEntities();
|
|
184
|
+
const { mutateAsync: updateMapping, isPending: isUpdatingMapping } = useUpdateMapping();
|
|
185
|
+
const handleSaveMapping = async ({ values, table }) => {
|
|
186
|
+
var _a;
|
|
187
|
+
setValidationErrors({});
|
|
188
|
+
values.entityName = ((_a = fetchedCatalogEntities.find(
|
|
189
|
+
(entity) => entity.id === values.entityRef
|
|
190
|
+
)) == null ? void 0 : _a.name) || "";
|
|
191
|
+
values.status = "RefreshToUpdate";
|
|
192
|
+
await updateMapping(values);
|
|
193
|
+
table.setEditingRow(null);
|
|
194
|
+
};
|
|
195
|
+
const openInBrowser = (url) => {
|
|
196
|
+
window.open(url, "_blank", "noreferrer");
|
|
197
|
+
};
|
|
198
|
+
const dataTable = useMaterialReactTable({
|
|
199
|
+
columns,
|
|
200
|
+
data: fetchedMappings,
|
|
201
|
+
editDisplayMode: "modal",
|
|
202
|
+
// default ('row', 'cell', 'table', and 'custom' are also available)
|
|
203
|
+
enableEditing: true,
|
|
204
|
+
positionActionsColumn: "last",
|
|
205
|
+
enableStickyHeader: true,
|
|
206
|
+
enableFilters: true,
|
|
207
|
+
getRowId: (row) => row.serviceId,
|
|
208
|
+
muiToolbarAlertBannerProps: isLoadingMappingsError ? {
|
|
209
|
+
color: "error",
|
|
210
|
+
children: "Error loading data"
|
|
211
|
+
} : void 0,
|
|
212
|
+
muiTableContainerProps: {
|
|
213
|
+
sx: {
|
|
214
|
+
minHeight: "500px"
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
onEditingRowCancel: () => setValidationErrors({}),
|
|
218
|
+
onEditingRowSave: handleSaveMapping,
|
|
219
|
+
// optionally customize modal content
|
|
220
|
+
renderEditRowDialogContent: ({ table, row, internalEditComponents }) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(DialogTitle, null, "Edit Mapping"), /* @__PURE__ */ React.createElement(DialogContent, null, internalEditComponents, " "), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(MRT_EditActionButtons, { variant: "text", table, row }))),
|
|
221
|
+
renderRowActions: ({ row, table }) => /* @__PURE__ */ React.createElement(Box, { sx: { display: "flex" } }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Edit" }, /* @__PURE__ */ React.createElement(IconButton, { onClick: () => table.setEditingRow(row) }, /* @__PURE__ */ React.createElement(EditIcon, null))), /* @__PURE__ */ React.createElement(Tooltip, { title: "Open in PagerDuty" }, /* @__PURE__ */ React.createElement(
|
|
222
|
+
IconButton,
|
|
223
|
+
{
|
|
224
|
+
onClick: () => openInBrowser(row.getValue("serviceUrl"))
|
|
225
|
+
},
|
|
226
|
+
/* @__PURE__ */ React.createElement(OpenInBrowserIcon, null)
|
|
227
|
+
))),
|
|
228
|
+
state: {
|
|
229
|
+
isLoading: isLoadingMappings || isLoadingCatalogEntities,
|
|
230
|
+
isSaving: isUpdatingMapping,
|
|
231
|
+
showAlertBanner: isLoadingMappingsError || isLoadingCatalogEntitiesError,
|
|
232
|
+
showProgressBars: isFetchingMappings || isFetchingCatalogEntities,
|
|
233
|
+
columnVisibility: {
|
|
234
|
+
serviceId: false,
|
|
235
|
+
entityRef: false,
|
|
236
|
+
serviceUrl: false
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
return /* @__PURE__ */ React.createElement(MaterialReactTable, { table: dataTable });
|
|
241
|
+
};
|
|
242
|
+
const queryClient = new QueryClient();
|
|
243
|
+
return /* @__PURE__ */ React.createElement(QueryClientProvider, { client: queryClient }, /* @__PURE__ */ React.createElement(DenseTable, null));
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export { ServiceMappingComponent };
|
|
247
|
+
//# sourceMappingURL=ServiceMappingComponent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceMappingComponent.esm.js","sources":["../../../src/components/PagerDutyPage/ServiceMappingComponent.tsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\nimport {\n Box,\n DialogActions,\n DialogContent,\n DialogTitle,\n IconButton,\n Tooltip,\n Typography,\n} from \"@material-ui/core\";\nimport EditIcon from \"@mui/icons-material/Edit\";\nimport { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { pagerDutyApiRef } from \"../../api\";\nimport {\n QueryClient,\n QueryClientProvider,\n useMutation,\n useQuery,\n} from \"@tanstack/react-query\";\nimport {\n MRT_ColumnDef,\n MRT_EditActionButtons,\n MRT_TableOptions,\n MaterialReactTable,\n useMaterialReactTable,\n} from \"material-react-table\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport OpenInBrowser from \"@material-ui/icons/OpenInBrowser\";\n\ntype Service = {\n name: string; // \"Ads\"\n id: string; // \"QWe1j283n12j132\"\n system: string; // \"Production\"\n owner: string; // \"Mapped\"\n lifecycle: string; // \"Ads\"\n};\n\nfunction getColorFromStatus(status?: string) {\n switch (status) {\n case \"InSync\":\n return \"green\";\n case \"OutOfSync\":\n return \"red\";\n case \"NotMapped\":\n return \"orange\";\n default:\n return \"gray\";\n }\n}\n\nfunction makeReadable(status?: string) {\n switch (status) {\n case \"InSync\":\n return \"In Sync\";\n case \"OutOfSync\":\n return \"Out of Sync\";\n case \"NotMapped\":\n return \"Not Mapped\";\n default:\n return \"Refresh to Update\";\n }\n}\n\nexport const ServiceMappingComponent = () => {\n const [_, setEntityMappings] = useState<\n PagerDutyEntityMapping[]\n >([]);\n // const [catalogEntities, setCatalogEntities] = useState<Service[]>([]);\n // const [entityOptions, setEntityOptions] = useState<CatalogEntityOptions[]>([]);\n\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n // function fetchCatalogEntities() {\n // catalogApi\n // .getEntities({\n // filter: { kind: \"Component\" },\n // })\n // .then((result) => {\n // const entities: Service[] = [];\n // result.items.forEach((entity: any) => {\n // entities.push({\n // name: entity.metadata?.name,\n // id: entity.metadata?.uid ?? \"\",\n // system: JSON.stringify(entity.spec?.system) || \"\",\n // owner: JSON.stringify(entity.spec?.owner) || \"\",\n // lifecycle: JSON.stringify(entity.spec?.lifecycle) || \"\",\n // });\n // });\n\n // setCatalogEntities(entities);\n // });\n // }\n\n // type CatalogEntityOptions = {\n // value: string;\n // label: string;\n // };\n\n // function getCatalogEntityOptions(): CatalogEntityOptions[] {\n // const options: CatalogEntityOptions[] = [];\n // // if (entityOptions.length === 0) {\n // // initialize with empty object\n // options.push({ value: \"\", label: \"None\" });\n // // }\n\n // catalogEntities.forEach((entity) => {\n // // find entity with entity.id in entityMappings array\n // const foundEntity = entityMappings.find(\n // (item) => item.entityRef === entity.id\n // );\n\n // if (!foundEntity) {\n // options.push({\n // value: entity.id,\n // label: entity.name,\n // });\n // }\n // });\n\n // // setEntityOptions(options);\n\n // return options;\n // }\n\n // READ hook (get mappings from api)\n function useGetMappings() {\n return useQuery<PagerDutyEntityMapping[]>({\n queryKey: [\"mappings\"],\n queryFn: async () => {\n // send api request here\n const { mappings: foundMappings } =\n await pagerDutyApi.getEntityMappings();\n\n setEntityMappings(foundMappings);\n\n return foundMappings;\n },\n refetchOnWindowFocus: false,\n });\n }\n\n // READ hook (get catalog entities from api)\n function useGetCatalogEntities() {\n return useQuery<Service[]>({\n queryKey: [\"catalogEntities\"],\n queryFn: async () => {\n // send api request here\n const result = await catalogApi.getEntities({\n filter: { kind: \"Component\" },\n });\n\n const entities: Service[] = [];\n result.items.forEach((entity: any) => {\n entities.push({\n name: entity.metadata?.name,\n id: entity.metadata?.uid ?? \"\",\n system: JSON.stringify(entity.spec?.system) || \"\",\n owner: JSON.stringify(entity.spec?.owner) || \"\",\n lifecycle: JSON.stringify(entity.spec?.lifecycle) || \"\",\n });\n });\n\n // setCatalogEntities(entities);\n\n return entities;\n },\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n });\n }\n\n // UPDATE hook (put mapping in api)\n function useUpdateMapping() {\n // const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (mapping: PagerDutyEntityMapping) => {\n return await pagerDutyApi.storeServiceMapping(\n mapping.serviceId,\n mapping.entityRef\n );\n },\n // client side optimistic update\n // onMutate: (newMappingInfo: PagerDutyEntityMapping) => {\n // queryClient.setQueryData([\"updateMappings\"], (prevMappings: any) =>\n // prevMappings?.map((prevMapping: PagerDutyEntityMapping) => {\n // if (prevMapping.serviceId === newMappingInfo.serviceId) {\n // newMappingInfo.entityName =\n // fetchedCatalogEntities.find(\n // (entity) => entity.id === newMappingInfo.entityRef\n // )?.name || \"\";\n\n // return newMappingInfo;\n // }\n // return prevMapping;\n // })\n // );\n // },\n });\n }\n\n const DenseTable = () => {\n const [validationErrors, setValidationErrors] = useState<\n Record<string, string | undefined>\n >({});\n\n const columns = useMemo<MRT_ColumnDef<PagerDutyEntityMapping>[]>(\n () => [\n {\n accessorKey: \"serviceId\",\n header: \"Service ID\",\n visibleInShowHideMenu: false,\n enableEditing: false,\n Edit: () => null,\n Cell: ({ cell }) => (\n <Typography variant=\"body1\" style={{ fontWeight: 600 }}>\n {cell.getValue<string>()}\n </Typography>\n ),\n },\n {\n accessorKey: \"serviceName\",\n header: \"PagerDuty Service\",\n enableEditing: false,\n },\n {\n accessorKey: \"team\",\n header: \"Team\",\n enableEditing: false,\n },\n {\n accessorKey: \"escalationPolicy\",\n header: \"Escalation Policy\",\n enableEditing: false,\n },\n {\n accessorKey: \"entityRef\",\n header: \"Mapping\",\n visibleInShowHideMenu: false,\n editVariant: \"select\",\n editSelectOptions: [], // getCatalogEntityOptions(),\n muiEditTextFieldProps: {\n select: true,\n error: !!validationErrors?.state,\n helperText: validationErrors?.state,\n },\n },\n {\n accessorKey: \"entityName\",\n header: \"Mapped Entity Name\",\n enableEditing: false,\n Edit: () => null,\n },\n {\n accessorKey: \"status\",\n header: \"Status\",\n enableEditing: false,\n Edit: () => null,\n Cell: ({ cell }) => (\n <Box\n component=\"span\"\n bgcolor={getColorFromStatus(cell.getValue<string>())}\n borderRadius=\"0.25rem\"\n color=\"white\"\n p=\"0.25rem\"\n >\n {makeReadable(cell.getValue<string>())}\n </Box>\n ),\n },\n {\n accessorKey: \"serviceUrl\",\n header: \"Service URL\",\n visibleInShowHideMenu: false,\n enableEditing: false,\n Edit: () => null,\n },\n ],\n [validationErrors]\n );\n\n // call READ hook\n const {\n data: fetchedMappings = [],\n isError: isLoadingMappingsError,\n isFetching: isFetchingMappings,\n isLoading: isLoadingMappings,\n } = useGetMappings();\n\n // call READ hook\n const {\n data: fetchedCatalogEntities = [],\n isError: isLoadingCatalogEntitiesError,\n isFetching: isFetchingCatalogEntities,\n isLoading: isLoadingCatalogEntities,\n } = useGetCatalogEntities();\n\n // call UPDATE hook\n const { mutateAsync: updateMapping, isPending: isUpdatingMapping } =\n useUpdateMapping();\n\n // UPDATE action\n const handleSaveMapping: MRT_TableOptions<PagerDutyEntityMapping>[\"onEditingRowSave\"] =\n async ({ values, table }) => {\n setValidationErrors({});\n values.entityName =\n fetchedCatalogEntities.find(\n (entity) => entity.id === values.entityRef\n )?.name || \"\";\n values.status = \"RefreshToUpdate\";\n await updateMapping(values);\n table.setEditingRow(null); // exit editing mode\n };\n\n const openInBrowser = (url: string) => {\n window.open(url, \"_blank\", \"noreferrer\");\n };\n\n const dataTable = useMaterialReactTable({\n columns,\n data: fetchedMappings,\n editDisplayMode: \"modal\", // default ('row', 'cell', 'table', and 'custom' are also available)\n enableEditing: true,\n positionActionsColumn: \"last\",\n enableStickyHeader: true,\n enableFilters: true,\n getRowId: (row) => row.serviceId,\n muiToolbarAlertBannerProps: isLoadingMappingsError\n ? {\n color: \"error\",\n children: \"Error loading data\",\n }\n : undefined,\n muiTableContainerProps: {\n sx: {\n minHeight: \"500px\",\n },\n },\n onEditingRowCancel: () => setValidationErrors({}),\n onEditingRowSave: handleSaveMapping,\n // optionally customize modal content\n renderEditRowDialogContent: ({ table, row, internalEditComponents }) => (\n <>\n <DialogTitle>Edit Mapping</DialogTitle>\n <DialogContent>{internalEditComponents} </DialogContent>\n <DialogActions>\n <MRT_EditActionButtons variant=\"text\" table={table} row={row} />\n </DialogActions>\n </>\n ),\n renderRowActions: ({ row, table }) => (\n <Box sx={{ display: \"flex\" }}>\n <Tooltip title=\"Edit\">\n <IconButton onClick={() => table.setEditingRow(row)}>\n <EditIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Open in PagerDuty\">\n <IconButton\n onClick={() => openInBrowser(row.getValue(\"serviceUrl\"))}\n >\n <OpenInBrowser />\n </IconButton>\n </Tooltip>\n </Box>\n ),\n state: {\n isLoading: isLoadingMappings || isLoadingCatalogEntities,\n isSaving: isUpdatingMapping,\n showAlertBanner:\n isLoadingMappingsError || isLoadingCatalogEntitiesError,\n showProgressBars: isFetchingMappings || isFetchingCatalogEntities,\n columnVisibility: {\n serviceId: false,\n entityRef: false,\n serviceUrl: false,\n },\n },\n });\n\n return <MaterialReactTable table={dataTable} />;\n };\n\n const queryClient = new QueryClient();\n\n return (\n <QueryClientProvider client={queryClient}>\n <DenseTable />\n </QueryClientProvider>\n );\n};\n"],"names":["OpenInBrowser"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Grid, Typography } from '@material-ui/core';
|
|
3
|
+
import { Page, Header, Content } from '@backstage/core-components';
|
|
4
|
+
import { ServiceMappingComponent } from './ServiceMappingComponent.esm.js';
|
|
5
|
+
|
|
6
|
+
const PagerDutyPage = () => {
|
|
7
|
+
return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(Header, { title: "PagerDuty", subtitle: "Advanced configurations" }), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { variant: "h4" }, "Service to Entity mapping"), /* @__PURE__ */ React.createElement(Typography, { variant: "body1" }, "Easily map your services to entities in Backstage without the need to add anotations to all your projects."), /* @__PURE__ */ React.createElement(Typography, { variant: "body1" }, /* @__PURE__ */ React.createElement("b", null, "Warning: "), "Only 1:1 mapping is allowed at this time.")), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(ServiceMappingComponent, null)))));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { PagerDutyPage };
|
|
11
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Grid, Typography } from \"@material-ui/core\";\nimport { Header, Page, Content } from \"@backstage/core-components\";\nimport { ServiceMappingComponent } from \"./ServiceMappingComponent\";\n\n/** @public */\nexport const PagerDutyPage = () => {\n return (\n <Page themeId=\"home\">\n <Header title=\"PagerDuty\" subtitle=\"Advanced configurations\" />\n <Content>\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <Typography variant=\"h4\">Service to Entity mapping</Typography>\n <Typography variant=\"body1\">\n Easily map your services to entities in Backstage without the need to add anotations to all your projects.\n </Typography>\n <Typography variant=\"body1\">\n <b>Warning: </b>Only 1:1 mapping is allowed at this time.\n </Typography>\n </Grid>\n <Grid item>\n <ServiceMappingComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;AAMO,MAAM,gBAAgB,MAAM;AACjC,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAM,WAAY,EAAA,QAAA,EAAS,yBAA0B,EAAA,CAAA,kBAC5D,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,sCACE,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CAAG,EAAA,SAAA,EAAU,QACpC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAK,2BAAyB,CAAA,kBACjD,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAQ,4GAE5B,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,kBACjB,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,IAAA,EAAE,WAAS,CAAA,EAAI,2CAClB,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAwB,EAAA,IAAA,CAC3B,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
|
package/dist/hooks/index.esm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
2
2
|
import { getPagerDutyEntity } from '../components/pagerDutyEntity.esm.js';
|
|
3
|
+
import '@backstage/core-plugin-api';
|
|
4
|
+
import 'react-use';
|
|
3
5
|
|
|
4
6
|
function usePagerdutyEntity() {
|
|
5
7
|
const { entity } = useEntity();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../src/hooks/index.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\n\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { PagerDutyEntity } from '../types';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\n\nexport function usePagerdutyEntity(): PagerDutyEntity {\n const { entity } = useEntity();\n\n return getPagerDutyEntity(entity);\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/hooks/index.ts"],"sourcesContent":["/*\n * Copyright 2020 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 */\n\nimport { catalogApiRef, useEntity } from '@backstage/plugin-catalog-react';\nimport { PagerDutyEntity } from '../types';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsync } from 'react-use';\nimport { Entity } from '@backstage/catalog-model';\n\nexport function usePagerdutyEntity(): PagerDutyEntity {\n const { entity } = useEntity();\n\n return getPagerDutyEntity(entity);\n}\n\nexport function useCatalogEntities() : Entity[] {\n const catalogApi = useApi(catalogApiRef);\n\n const { value: entities, error, loading } = useAsync( async () => catalogApi.getEntities({\n filter: {\n kind: 'Component',\n },\n }), []);\n\n if (error) {\n throw error;\n }\n\n if (loading) {\n return [];\n }\n\n return entities?.items || []; \n}\n"],"names":[],"mappings":";;;;;AAuBO,SAAS,kBAAsC,GAAA;AACpD,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAE7B,EAAA,OAAO,mBAAmB,MAAM,CAAA,CAAA;AAClC;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import * as _backstage_plugin_home_react from '@backstage/plugin-home-react';
|
|
3
2
|
import { Entity } from '@backstage/catalog-model';
|
|
4
|
-
import * as
|
|
5
|
-
import
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import react__default, { ReactNode } from 'react';
|
|
6
5
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
7
6
|
import { DiscoveryApi, FetchApi, ConfigApi } from '@backstage/core-plugin-api';
|
|
8
|
-
import { PagerDutyServiceResponse, PagerDutyIncidentsResponse, PagerDutyChangeEventsResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyUser } from '@pagerduty/backstage-plugin-common';
|
|
7
|
+
import { PagerDutyEntityMappingResponse, PagerDutyServiceResponse, PagerDutyIncidentsResponse, PagerDutyChangeEventsResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyUser } from '@pagerduty/backstage-plugin-common';
|
|
9
8
|
|
|
10
9
|
/** @public */
|
|
11
10
|
declare const isPluginApplicableToEntity$1: (entity: Entity) => boolean;
|
|
@@ -40,16 +39,18 @@ type HomePagePagerDutyCardProps = PagerDutyEntity & {
|
|
|
40
39
|
/** @public */
|
|
41
40
|
declare const pagerDutyPlugin: _backstage_core_plugin_api.BackstagePlugin<{}, {}, {}>;
|
|
42
41
|
/** @public */
|
|
43
|
-
declare const
|
|
42
|
+
declare const PagerDutyPage: () => react.JSX.Element;
|
|
44
43
|
/** @public */
|
|
45
|
-
declare const
|
|
44
|
+
declare const EntityPagerDutyCard: (props: EntityPagerDutyCardProps) => react.JSX.Element;
|
|
46
45
|
/** @public */
|
|
47
|
-
declare const
|
|
46
|
+
declare const EntityPagerDutySmallCard: (props: EntityPagerDutySmallCardProps) => react.JSX.Element;
|
|
47
|
+
/** @public */
|
|
48
|
+
declare const HomePagePagerDutyCard: (props: _backstage_plugin_home_react.CardExtensionProps<HomePagePagerDutyCardProps>) => react.JSX.Element;
|
|
48
49
|
|
|
49
50
|
/** @public */
|
|
50
51
|
declare function TriggerButton(props: {
|
|
51
52
|
children?: ReactNode;
|
|
52
|
-
}):
|
|
53
|
+
}): react__default.JSX.Element;
|
|
53
54
|
|
|
54
55
|
/** @public */
|
|
55
56
|
type PagerDutyTriggerAlarmRequest = {
|
|
@@ -60,6 +61,16 @@ type PagerDutyTriggerAlarmRequest = {
|
|
|
60
61
|
};
|
|
61
62
|
/** @public */
|
|
62
63
|
interface PagerDutyApi {
|
|
64
|
+
/**
|
|
65
|
+
* Fetches all entity mappings.
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
getEntityMappings(): Promise<PagerDutyEntityMappingResponse>;
|
|
69
|
+
/**
|
|
70
|
+
* Stores the service mapping in the database.
|
|
71
|
+
*
|
|
72
|
+
*/
|
|
73
|
+
storeServiceMapping(serviceId: string, entityId: string): Promise<Response>;
|
|
63
74
|
/**
|
|
64
75
|
* Fetches the service for the provided pager duty Entity.
|
|
65
76
|
*
|
|
@@ -126,6 +137,8 @@ declare class PagerDutyClient implements PagerDutyApi {
|
|
|
126
137
|
static fromConfig(configApi: ConfigApi, dependencies: PagerDutyClientApiDependencies): PagerDutyClient;
|
|
127
138
|
constructor(config: PagerDutyClientApiConfig);
|
|
128
139
|
getServiceByPagerDutyEntity(pagerDutyEntity: PagerDutyEntity): Promise<PagerDutyServiceResponse>;
|
|
140
|
+
getEntityMappings(): Promise<PagerDutyEntityMappingResponse>;
|
|
141
|
+
storeServiceMapping(serviceId: string, backstageEntityId: string): Promise<Response>;
|
|
129
142
|
getServiceByEntity(entity: Entity): Promise<PagerDutyServiceResponse>;
|
|
130
143
|
getServiceById(serviceId: string): Promise<PagerDutyServiceResponse>;
|
|
131
144
|
getIncidentsByServiceId(serviceId: string): Promise<PagerDutyIncidentsResponse>;
|
|
@@ -142,11 +155,11 @@ declare class PagerDutyClient implements PagerDutyApi {
|
|
|
142
155
|
* @public
|
|
143
156
|
* @deprecated Please use EntityPagerDutyCard
|
|
144
157
|
*/
|
|
145
|
-
declare const PagerDutyCard: (props: EntityPagerDutyCardProps) =>
|
|
158
|
+
declare const PagerDutyCard: (props: EntityPagerDutyCardProps) => react.JSX.Element;
|
|
146
159
|
/**
|
|
147
160
|
* @public
|
|
148
161
|
* @deprecated Please use EntityPagerDutyCardProps
|
|
149
162
|
*/
|
|
150
163
|
type PagerDutyCardProps = EntityPagerDutyCardProps;
|
|
151
164
|
|
|
152
|
-
export { EntityPagerDutyCard, type EntityPagerDutyCardProps, EntityPagerDutySmallCard, type EntityPagerDutySmallCardProps, HomePagePagerDutyCard, type HomePagePagerDutyCardProps, type PagerDutyApi, PagerDutyCard, type PagerDutyCardProps, PagerDutyClient, type PagerDutyClientApiConfig, type PagerDutyClientApiDependencies, type PagerDutyEntity, type PagerDutyTriggerAlarmRequest, TriggerButton, UnauthorizedError, isPluginApplicableToEntity as isPagerDutyAvailable, isPluginApplicableToEntity$1 as isPagerDutySmallCardAvailable, isPluginApplicableToEntity, pagerDutyApiRef, pagerDutyPlugin, pagerDutyPlugin as plugin };
|
|
165
|
+
export { EntityPagerDutyCard, type EntityPagerDutyCardProps, EntityPagerDutySmallCard, type EntityPagerDutySmallCardProps, HomePagePagerDutyCard, type HomePagePagerDutyCardProps, type PagerDutyApi, PagerDutyCard, type PagerDutyCardProps, PagerDutyClient, type PagerDutyClientApiConfig, type PagerDutyClientApiDependencies, type PagerDutyEntity, PagerDutyPage, type PagerDutyTriggerAlarmRequest, TriggerButton, UnauthorizedError, isPluginApplicableToEntity as isPagerDutyAvailable, isPluginApplicableToEntity$1 as isPagerDutySmallCardAvailable, isPluginApplicableToEntity, pagerDutyApiRef, pagerDutyPlugin, pagerDutyPlugin as plugin };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { EntityPagerDutyCard, EntityPagerDutySmallCard, HomePagePagerDutyCard, pagerDutyPlugin, pagerDutyPlugin as plugin } from './plugin.esm.js';
|
|
1
|
+
export { EntityPagerDutyCard, EntityPagerDutySmallCard, HomePagePagerDutyCard, PagerDutyPage, pagerDutyPlugin, pagerDutyPlugin as plugin } from './plugin.esm.js';
|
|
2
2
|
export { isPluginApplicableToEntity as isPagerDutyAvailable, isPluginApplicableToEntity } from './components/EntityPagerDutyCard/index.esm.js';
|
|
3
3
|
export { isPluginApplicableToEntity as isPagerDutySmallCardAvailable } from './components/EntityPagerDutySmallCard/index.esm.js';
|
|
4
4
|
export { TriggerButton } from './components/TriggerButton/index.esm.js';
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { pagerDutyApiRef, PagerDutyClient } from './api/client.esm.js';
|
|
2
|
-
import { createRouteRef, createPlugin, createApiFactory, discoveryApiRef, configApiRef, fetchApiRef, createComponentExtension } from '@backstage/core-plugin-api';
|
|
2
|
+
import { createRouteRef, createPlugin, createApiFactory, discoveryApiRef, configApiRef, fetchApiRef, createRoutableExtension, createComponentExtension } from '@backstage/core-plugin-api';
|
|
3
3
|
import { createCardExtension } from '@backstage/plugin-home-react';
|
|
4
4
|
|
|
5
|
-
createRouteRef({
|
|
5
|
+
const rootRouteRef = createRouteRef({
|
|
6
6
|
id: "pagerduty"
|
|
7
7
|
});
|
|
8
8
|
const pagerDutyPlugin = createPlugin({
|
|
@@ -19,6 +19,13 @@ const pagerDutyPlugin = createPlugin({
|
|
|
19
19
|
})
|
|
20
20
|
]
|
|
21
21
|
});
|
|
22
|
+
const PagerDutyPage = pagerDutyPlugin.provide(
|
|
23
|
+
createRoutableExtension({
|
|
24
|
+
name: "PagerDutyPage",
|
|
25
|
+
component: () => import('./components/PagerDutyPage/index.esm.js').then((m) => m.PagerDutyPage),
|
|
26
|
+
mountPoint: rootRouteRef
|
|
27
|
+
})
|
|
28
|
+
);
|
|
22
29
|
const EntityPagerDutyCard = pagerDutyPlugin.provide(
|
|
23
30
|
createComponentExtension({
|
|
24
31
|
name: "EntityPagerDutyCard",
|
|
@@ -67,5 +74,5 @@ const HomePagePagerDutyCard = pagerDutyPlugin.provide(
|
|
|
67
74
|
})
|
|
68
75
|
);
|
|
69
76
|
|
|
70
|
-
export { EntityPagerDutyCard, EntityPagerDutySmallCard, HomePagePagerDutyCard, pagerDutyPlugin };
|
|
77
|
+
export { EntityPagerDutyCard, EntityPagerDutySmallCard, HomePagePagerDutyCard, PagerDutyPage, pagerDutyPlugin, rootRouteRef };
|
|
71
78
|
//# sourceMappingURL=plugin.esm.js.map
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { pagerDutyApiRef, PagerDutyClient } from './api';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n fetchApiRef,\n configApiRef,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from '@backstage/plugin-home-react';\nimport { HomePagePagerDutyCardProps } from './components/HomePagePagerDutyCard/Content';\n\nexport const rootRouteRef = createRouteRef({\n id: 'pagerduty',\n});\n\n/** @public */\nexport const pagerDutyPlugin = createPlugin({\n id: 'pagerduty',\n apis: [\n createApiFactory({\n api: pagerDutyApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n configApi: configApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n PagerDutyClient.fromConfig(configApi, { discoveryApi, fetchApi }),\n }),\n ],\n});\n\n/** @public */\nexport const EntityPagerDutyCard = pagerDutyPlugin.provide(\n createComponentExtension({\n name: 'EntityPagerDutyCard',\n component: {\n lazy: () =>\n import('./components/EntityPagerDutyCard').then(\n m => m.EntityPagerDutyCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const EntityPagerDutySmallCard = pagerDutyPlugin.provide(\n createComponentExtension({\n name: 'EntityPagerDutySmallCard',\n component: {\n lazy: () =>\n import('./components/EntityPagerDutySmallCard').then(\n m => m.EntityPagerDutySmallCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const HomePagePagerDutyCard = pagerDutyPlugin.provide(\n createCardExtension<HomePagePagerDutyCardProps>({\n name: 'HomePagePagerDutyCard',\n title: 'PagerDuty Homepage Card',\n components: () => import('./components/HomePagePagerDutyCard'),\n settings: {\n schema: {\n title: 'PagerDuty',\n type: 'object',\n properties: {\n integrationKey: {\n title: 'PagerDuty integration key',\n type: 'string',\n },\n serviceId: {\n title: 'PagerDuty service id',\n type: 'string',\n },\n name: {\n title: 'PagerDuty service name',\n type: 'string',\n },\n },\n },\n },\n }),\n);\n"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { pagerDutyApiRef, PagerDutyClient } from './api';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n fetchApiRef,\n configApiRef,\n createComponentExtension,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from '@backstage/plugin-home-react';\nimport { HomePagePagerDutyCardProps } from './components/HomePagePagerDutyCard/Content';\n\nexport const rootRouteRef = createRouteRef({\n id: 'pagerduty',\n});\n\n/** @public */\nexport const pagerDutyPlugin = createPlugin({\n id: 'pagerduty',\n apis: [\n createApiFactory({\n api: pagerDutyApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n configApi: configApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n PagerDutyClient.fromConfig(configApi, { discoveryApi, fetchApi }),\n }),\n ],\n});\n\n/** @public */\nexport const PagerDutyPage = pagerDutyPlugin.provide(\n createRoutableExtension({\n name: 'PagerDutyPage',\n component: () => import('./components/PagerDutyPage').then(m => m.PagerDutyPage),\n mountPoint: rootRouteRef,\n })\n)\n\n/** @public */\nexport const EntityPagerDutyCard = pagerDutyPlugin.provide(\n createComponentExtension({\n name: 'EntityPagerDutyCard',\n component: {\n lazy: () =>\n import('./components/EntityPagerDutyCard').then(\n m => m.EntityPagerDutyCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const EntityPagerDutySmallCard = pagerDutyPlugin.provide(\n createComponentExtension({\n name: 'EntityPagerDutySmallCard',\n component: {\n lazy: () =>\n import('./components/EntityPagerDutySmallCard').then(\n m => m.EntityPagerDutySmallCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const HomePagePagerDutyCard = pagerDutyPlugin.provide(\n createCardExtension<HomePagePagerDutyCardProps>({\n name: 'HomePagePagerDutyCard',\n title: 'PagerDuty Homepage Card',\n components: () => import('./components/HomePagePagerDutyCard'),\n settings: {\n schema: {\n title: 'PagerDuty',\n type: 'object',\n properties: {\n integrationKey: {\n title: 'PagerDuty integration key',\n type: 'string',\n },\n serviceId: {\n title: 'PagerDuty service id',\n type: 'string',\n },\n name: {\n title: 'PagerDuty service name',\n type: 'string',\n },\n },\n },\n },\n }),\n);\n"],"names":[],"mappings":";;;;AA6BO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA,WAAA;AACN,CAAC,EAAA;AAGM,MAAM,kBAAkB,YAAa,CAAA;AAAA,EAC1C,EAAI,EAAA,WAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,eAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,SAAW,EAAA,YAAA;AAAA,QACX,QAAU,EAAA,WAAA;AAAA,OACZ;AAAA,MACA,OAAS,EAAA,CAAC,EAAE,SAAA,EAAW,YAAc,EAAA,QAAA,EACnC,KAAA,eAAA,CAAgB,UAAW,CAAA,SAAA,EAAW,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,KACnE,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAGM,MAAM,gBAAgB,eAAgB,CAAA,OAAA;AAAA,EAC3C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,eAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,yCAA4B,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,aAAa,CAAA;AAAA,IAC/E,UAAY,EAAA,YAAA;AAAA,GACb,CAAA;AACH,EAAA;AAGO,MAAM,sBAAsB,eAAgB,CAAA,OAAA;AAAA,EACjD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,qBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,+CAAkC,CAAE,CAAA,IAAA;AAAA,QACzC,OAAK,CAAE,CAAA,mBAAA;AAAA,OACT;AAAA,KACJ;AAAA,GACD,CAAA;AACH,EAAA;AAGO,MAAM,2BAA2B,eAAgB,CAAA,OAAA;AAAA,EACtD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,oDAAuC,CAAE,CAAA,IAAA;AAAA,QAC9C,OAAK,CAAE,CAAA,wBAAA;AAAA,OACT;AAAA,KACJ;AAAA,GACD,CAAA;AACH,EAAA;AAGO,MAAM,wBAAwB,eAAgB,CAAA,OAAA;AAAA,EACnD,mBAAgD,CAAA;AAAA,IAC9C,IAAM,EAAA,uBAAA;AAAA,IACN,KAAO,EAAA,yBAAA;AAAA,IACP,UAAA,EAAY,MAAM,OAAO,iDAAoC,CAAA;AAAA,IAC7D,QAAU,EAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA,WAAA;AAAA,QACP,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,cAAgB,EAAA;AAAA,YACd,KAAO,EAAA,2BAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,SAAW,EAAA;AAAA,YACT,KAAO,EAAA,sBAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,IAAM,EAAA;AAAA,YACJ,KAAO,EAAA,wBAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACD,CAAA;AACH;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin",
|
|
3
3
|
"description": "A Backstage plugin that integrates towards PagerDuty",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.13.0-next.1",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -40,19 +40,26 @@
|
|
|
40
40
|
"@backstage/plugin-catalog-react": "^1.12.0",
|
|
41
41
|
"@backstage/plugin-home-react": "^0.1.13",
|
|
42
42
|
"@backstage/theme": "^0.5.5",
|
|
43
|
+
"@emotion/react": "^11.11.4",
|
|
44
|
+
"@emotion/styled": "^11.11.5",
|
|
43
45
|
"@material-ui/core": "^4.12.2",
|
|
44
46
|
"@material-ui/icons": "^4.9.1",
|
|
45
47
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
48
|
+
"@mui/icons-material": "^5.15.19",
|
|
49
|
+
"@mui/material": "^5.15.19",
|
|
50
|
+
"@mui/x-date-pickers": "^7.6.1",
|
|
51
|
+
"@pagerduty/backstage-plugin-common": "^0.1.5-next.8",
|
|
52
|
+
"@tanstack/react-query": "^5.40.1",
|
|
46
53
|
"classnames": "^2.2.6",
|
|
47
54
|
"luxon": "^3.4.1",
|
|
55
|
+
"material-react-table": "^2.13.0",
|
|
48
56
|
"react-use": "^17.2.4",
|
|
49
57
|
"validate-color": "^2.2.4"
|
|
50
58
|
},
|
|
51
59
|
"peerDependencies": {
|
|
52
|
-
"
|
|
53
|
-
"react": "^
|
|
54
|
-
"react-dom": "^
|
|
55
|
-
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
60
|
+
"react": "^18.0.0 || ^20.0.0",
|
|
61
|
+
"react-dom": "^18.0.0 || ^20.0.0",
|
|
62
|
+
"react-router-dom": "^6.3.0"
|
|
56
63
|
},
|
|
57
64
|
"devDependencies": {
|
|
58
65
|
"@backstage/cli": "^0.26.6",
|
|
@@ -61,7 +68,6 @@
|
|
|
61
68
|
"@backstage/test-utils": "^1.5.5",
|
|
62
69
|
"@commitlint/cli": "^17.7.1",
|
|
63
70
|
"@commitlint/config-conventional": "^17.7.0",
|
|
64
|
-
"@pagerduty/backstage-plugin-common": "^0.1.2",
|
|
65
71
|
"@testing-library/dom": "^8.0.0",
|
|
66
72
|
"@testing-library/jest-dom": "^5.10.1",
|
|
67
73
|
"@testing-library/react": "^12.1.3",
|