@backstage/plugin-kubernetes-react 0.3.4 → 0.3.5-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.
Files changed (154) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/api/KubernetesBackendClient.esm.js +137 -0
  3. package/dist/api/KubernetesBackendClient.esm.js.map +1 -0
  4. package/dist/api/KubernetesClusterLinkFormatter.esm.js +38 -0
  5. package/dist/api/KubernetesClusterLinkFormatter.esm.js.map +1 -0
  6. package/dist/api/KubernetesProxyClient.esm.js +76 -0
  7. package/dist/api/KubernetesProxyClient.esm.js.map +1 -0
  8. package/dist/api/formatters/AksClusterLinksFormatter.esm.js +35 -0
  9. package/dist/api/formatters/AksClusterLinksFormatter.esm.js.map +1 -0
  10. package/dist/api/formatters/EksClusterLinksFormatter.esm.js +10 -0
  11. package/dist/api/formatters/EksClusterLinksFormatter.esm.js.map +1 -0
  12. package/dist/api/formatters/GkeClusterLinksFormatter.esm.js +62 -0
  13. package/dist/api/formatters/GkeClusterLinksFormatter.esm.js.map +1 -0
  14. package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js +41 -0
  15. package/dist/api/formatters/OpenshiftClusterLinksFormatter.esm.js.map +1 -0
  16. package/dist/api/formatters/RancherClusterLinksFormatter.esm.js +33 -0
  17. package/dist/api/formatters/RancherClusterLinksFormatter.esm.js.map +1 -0
  18. package/dist/api/formatters/StandardClusterLinksFormatter.esm.js +37 -0
  19. package/dist/api/formatters/StandardClusterLinksFormatter.esm.js.map +1 -0
  20. package/dist/api/formatters/index.esm.js +21 -0
  21. package/dist/api/formatters/index.esm.js.map +1 -0
  22. package/dist/api/types.esm.js +14 -0
  23. package/dist/api/types.esm.js.map +1 -0
  24. package/dist/components/Cluster/Cluster.esm.js +88 -0
  25. package/dist/components/Cluster/Cluster.esm.js.map +1 -0
  26. package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js +80 -0
  27. package/dist/components/CronJobsAccordions/CronJobsAccordions.esm.js.map +1 -0
  28. package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js +51 -0
  29. package/dist/components/CronJobsAccordions/CronJobsDrawer.esm.js.map +1 -0
  30. package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js +222 -0
  31. package/dist/components/CustomResources/ArgoRollouts/Rollout.esm.js.map +1 -0
  32. package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js +40 -0
  33. package/dist/components/CustomResources/ArgoRollouts/RolloutDrawer.esm.js.map +1 -0
  34. package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js +32 -0
  35. package/dist/components/CustomResources/ArgoRollouts/StepsProgress.esm.js.map +1 -0
  36. package/dist/components/CustomResources/CustomResources.esm.js +44 -0
  37. package/dist/components/CustomResources/CustomResources.esm.js.map +1 -0
  38. package/dist/components/CustomResources/DefaultCustomResource.esm.js +79 -0
  39. package/dist/components/CustomResources/DefaultCustomResource.esm.js.map +1 -0
  40. package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js +43 -0
  41. package/dist/components/CustomResources/DefaultCustomResourceDrawer.esm.js.map +1 -0
  42. package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js +126 -0
  43. package/dist/components/DaemonSetsAccordions/DaemonSetsAccordions.esm.js.map +1 -0
  44. package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js +55 -0
  45. package/dist/components/DaemonSetsAccordions/DaemonSetsDrawer.esm.js.map +1 -0
  46. package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js +56 -0
  47. package/dist/components/DeploymentsAccordions/DeploymentDrawer.esm.js.map +1 -0
  48. package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js +160 -0
  49. package/dist/components/DeploymentsAccordions/DeploymentsAccordions.esm.js.map +1 -0
  50. package/dist/components/ErrorPanel/ErrorPanel.esm.js +27 -0
  51. package/dist/components/ErrorPanel/ErrorPanel.esm.js.map +1 -0
  52. package/dist/components/ErrorReporting/ErrorReporting.esm.js +63 -0
  53. package/dist/components/ErrorReporting/ErrorReporting.esm.js.map +1 -0
  54. package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js +34 -0
  55. package/dist/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.esm.js.map +1 -0
  56. package/dist/components/IngressesAccordions/IngressDrawer.esm.js +45 -0
  57. package/dist/components/IngressesAccordions/IngressDrawer.esm.js.map +1 -0
  58. package/dist/components/IngressesAccordions/IngressesAccordions.esm.js +62 -0
  59. package/dist/components/IngressesAccordions/IngressesAccordions.esm.js.map +1 -0
  60. package/dist/components/JobsAccordions/JobsAccordions.esm.js +101 -0
  61. package/dist/components/JobsAccordions/JobsAccordions.esm.js.map +1 -0
  62. package/dist/components/JobsAccordions/JobsDrawer.esm.js +48 -0
  63. package/dist/components/JobsAccordions/JobsDrawer.esm.js.map +1 -0
  64. package/dist/components/KubernetesDialog/KubernetesDialog.esm.js +72 -0
  65. package/dist/components/KubernetesDialog/KubernetesDialog.esm.js.map +1 -0
  66. package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js +117 -0
  67. package/dist/components/KubernetesDrawer/KubernetesDrawer.esm.js.map +1 -0
  68. package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js +199 -0
  69. package/dist/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.esm.js.map +1 -0
  70. package/dist/components/KubernetesDrawer/ManifestYaml.esm.js +44 -0
  71. package/dist/components/KubernetesDrawer/ManifestYaml.esm.js.map +1 -0
  72. package/dist/components/PodExecTerminal/PodExecTerminal.esm.js +88 -0
  73. package/dist/components/PodExecTerminal/PodExecTerminal.esm.js.map +1 -0
  74. package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js +40 -0
  75. package/dist/components/PodExecTerminal/PodExecTerminalAttachAddon.esm.js.map +1 -0
  76. package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js +35 -0
  77. package/dist/components/PodExecTerminal/PodExecTerminalDialog.esm.js.map +1 -0
  78. package/dist/components/Pods/ErrorList/ErrorList.esm.js +52 -0
  79. package/dist/components/Pods/ErrorList/ErrorList.esm.js.map +1 -0
  80. package/dist/components/Pods/Events/Events.esm.js +74 -0
  81. package/dist/components/Pods/Events/Events.esm.js.map +1 -0
  82. package/dist/components/Pods/Events/useEvents.esm.js +21 -0
  83. package/dist/components/Pods/Events/useEvents.esm.js.map +1 -0
  84. package/dist/components/Pods/FixDialog/FixDialog.esm.js +107 -0
  85. package/dist/components/Pods/FixDialog/FixDialog.esm.js.map +1 -0
  86. package/dist/components/Pods/PodDrawer/ContainerCard.esm.js +166 -0
  87. package/dist/components/Pods/PodDrawer/ContainerCard.esm.js.map +1 -0
  88. package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js +30 -0
  89. package/dist/components/Pods/PodDrawer/PendingPodContent.esm.js.map +1 -0
  90. package/dist/components/Pods/PodDrawer/PodDrawer.esm.js +114 -0
  91. package/dist/components/Pods/PodDrawer/PodDrawer.esm.js.map +1 -0
  92. package/dist/components/Pods/PodLogs/PodLogs.esm.js +44 -0
  93. package/dist/components/Pods/PodLogs/PodLogs.esm.js.map +1 -0
  94. package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js +21 -0
  95. package/dist/components/Pods/PodLogs/PodLogsDialog.esm.js.map +1 -0
  96. package/dist/components/Pods/PodLogs/usePodLogs.esm.js +19 -0
  97. package/dist/components/Pods/PodLogs/usePodLogs.esm.js.map +1 -0
  98. package/dist/components/Pods/PodsTable.esm.js +153 -0
  99. package/dist/components/Pods/PodsTable.esm.js.map +1 -0
  100. package/dist/components/ResourceUtilization/ResourceUtilization.esm.js +50 -0
  101. package/dist/components/ResourceUtilization/ResourceUtilization.esm.js.map +1 -0
  102. package/dist/components/ServicesAccordions/ServiceDrawer.esm.js +45 -0
  103. package/dist/components/ServicesAccordions/ServiceDrawer.esm.js.map +1 -0
  104. package/dist/components/ServicesAccordions/ServicesAccordions.esm.js +79 -0
  105. package/dist/components/ServicesAccordions/ServicesAccordions.esm.js.map +1 -0
  106. package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js +58 -0
  107. package/dist/components/StatefulSetsAccordions/StatefulSetDrawer.esm.js.map +1 -0
  108. package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js +156 -0
  109. package/dist/components/StatefulSetsAccordions/StatefulSetsAccordions.esm.js.map +1 -0
  110. package/dist/hooks/Cluster.esm.js +8 -0
  111. package/dist/hooks/Cluster.esm.js.map +1 -0
  112. package/dist/hooks/GroupedResponses.esm.js +19 -0
  113. package/dist/hooks/GroupedResponses.esm.js.map +1 -0
  114. package/dist/hooks/PodNamesWithErrors.esm.js +8 -0
  115. package/dist/hooks/PodNamesWithErrors.esm.js.map +1 -0
  116. package/dist/hooks/PodNamesWithMetrics.esm.js +6 -0
  117. package/dist/hooks/PodNamesWithMetrics.esm.js.map +1 -0
  118. package/dist/hooks/auth.esm.js +24 -0
  119. package/dist/hooks/auth.esm.js.map +1 -0
  120. package/dist/hooks/useCustomResources.esm.js +42 -0
  121. package/dist/hooks/useCustomResources.esm.js.map +1 -0
  122. package/dist/hooks/useIsPodExecTerminalEnabled.esm.js +9 -0
  123. package/dist/hooks/useIsPodExecTerminalEnabled.esm.js.map +1 -0
  124. package/dist/hooks/useIsPodExecTerminalSupported.esm.js +21 -0
  125. package/dist/hooks/useIsPodExecTerminalSupported.esm.js.map +1 -0
  126. package/dist/hooks/useKubernetesObjects.esm.js +36 -0
  127. package/dist/hooks/useKubernetesObjects.esm.js.map +1 -0
  128. package/dist/hooks/useMatchingErrors.esm.js +20 -0
  129. package/dist/hooks/useMatchingErrors.esm.js.map +1 -0
  130. package/dist/hooks/usePodMetrics.esm.js +20 -0
  131. package/dist/hooks/usePodMetrics.esm.js.map +1 -0
  132. package/dist/index.esm.js +53 -3465
  133. package/dist/index.esm.js.map +1 -1
  134. package/dist/kubernetes-auth-provider/AksKubernetesAuthProvider.esm.js +21 -0
  135. package/dist/kubernetes-auth-provider/AksKubernetesAuthProvider.esm.js.map +1 -0
  136. package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js +31 -0
  137. package/dist/kubernetes-auth-provider/GoogleKubernetesAuthProvider.esm.js.map +1 -0
  138. package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js +89 -0
  139. package/dist/kubernetes-auth-provider/KubernetesAuthProviders.esm.js.map +1 -0
  140. package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js +33 -0
  141. package/dist/kubernetes-auth-provider/OidcKubernetesAuthProvider.esm.js.map +1 -0
  142. package/dist/kubernetes-auth-provider/ServerSideAuthProvider.esm.js +11 -0
  143. package/dist/kubernetes-auth-provider/ServerSideAuthProvider.esm.js.map +1 -0
  144. package/dist/kubernetes-auth-provider/types.esm.js +8 -0
  145. package/dist/kubernetes-auth-provider/types.esm.js.map +1 -0
  146. package/dist/utils/crons.esm.js +22 -0
  147. package/dist/utils/crons.esm.js.map +1 -0
  148. package/dist/utils/owner.esm.js +30 -0
  149. package/dist/utils/owner.esm.js.map +1 -0
  150. package/dist/utils/pod.esm.js +120 -0
  151. package/dist/utils/pod.esm.js.map +1 -0
  152. package/dist/utils/resources.esm.js +19 -0
  153. package/dist/utils/resources.esm.js.map +1 -0
  154. package/package.json +6 -6
@@ -0,0 +1,88 @@
1
+ import 'xterm/css/xterm.css';
2
+ import { useApi, discoveryApiRef } from '@backstage/core-plugin-api';
3
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
4
+ import React__default, { useState, useEffect, useMemo } from 'react';
5
+ import { Terminal } from 'xterm';
6
+ import { FitAddon } from 'xterm-addon-fit';
7
+ import { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon.esm.js';
8
+
9
+ const hasSocketProtocol = (url) => /wss?:\/\//.test(url.toString());
10
+ const useStyles = makeStyles(
11
+ (theme) => createStyles({
12
+ podExecTerminal: {
13
+ width: "100%",
14
+ height: "100%",
15
+ "& .xterm-screen": { padding: theme.spacing(1) }
16
+ }
17
+ })
18
+ );
19
+ const PodExecTerminal = (props) => {
20
+ const classes = useStyles();
21
+ const { containerName, podNamespace, podName } = props;
22
+ const [baseUrl, setBaseUrl] = useState(window.location.host);
23
+ const terminalRef = React__default.useRef(null);
24
+ const discoveryApi = useApi(discoveryApiRef);
25
+ const namespace = podNamespace != null ? podNamespace : "default";
26
+ useEffect(() => {
27
+ discoveryApi.getBaseUrl("kubernetes").then((url) => url != null ? url : window.location.host).then((url) => url.replace(/^http(s?):\/\//, "ws$1://")).then((url) => setBaseUrl(url));
28
+ }, [discoveryApi]);
29
+ const urlParams = useMemo(() => {
30
+ const params = new URLSearchParams({
31
+ container: containerName,
32
+ stdin: "true",
33
+ stdout: "true",
34
+ stderr: "true",
35
+ tty: "true",
36
+ command: "/bin/sh"
37
+ });
38
+ return params;
39
+ }, [containerName]);
40
+ const socketUrl = useMemo(() => {
41
+ if (!hasSocketProtocol(baseUrl)) {
42
+ return "";
43
+ }
44
+ return new URL(
45
+ `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`
46
+ );
47
+ }, [baseUrl, namespace, podName, urlParams]);
48
+ useEffect(() => {
49
+ if (!hasSocketProtocol(socketUrl)) {
50
+ return () => {
51
+ };
52
+ }
53
+ const terminal = new Terminal();
54
+ const fitAddon = new FitAddon();
55
+ terminal.loadAddon(fitAddon);
56
+ if (terminalRef.current) {
57
+ terminal.open(terminalRef.current);
58
+ fitAddon.fit();
59
+ }
60
+ terminal.writeln("Starting terminal, please wait...");
61
+ const socket = new WebSocket(socketUrl, ["channel.k8s.io"]);
62
+ socket.onopen = () => {
63
+ terminal.clear();
64
+ const attachAddon = new PodExecTerminalAttachAddon(socket, {
65
+ bidirectional: true
66
+ });
67
+ terminal.loadAddon(attachAddon);
68
+ };
69
+ socket.onclose = () => {
70
+ terminal.writeln("Socket connection closed");
71
+ };
72
+ return () => {
73
+ terminal == null ? void 0 : terminal.clear();
74
+ socket == null ? void 0 : socket.close();
75
+ };
76
+ }, [baseUrl, socketUrl]);
77
+ return /* @__PURE__ */ React__default.createElement(
78
+ "div",
79
+ {
80
+ "data-testid": "terminal",
81
+ ref: terminalRef,
82
+ className: classes.podExecTerminal
83
+ }
84
+ );
85
+ };
86
+
87
+ export { PodExecTerminal };
88
+ //# sourceMappingURL=PodExecTerminal.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PodExecTerminal.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminal.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 'xterm/css/xterm.css';\n\nimport { discoveryApiRef, useApi } from '@backstage/core-plugin-api';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Terminal } from 'xterm';\nimport { FitAddon } from 'xterm-addon-fit';\n\nimport { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon';\n\n/**\n * Props drilled down to the PodExecTerminal component\n *\n * @public\n */\nexport interface PodExecTerminalProps {\n cluster: ClusterAttributes;\n containerName: string;\n podName: string;\n podNamespace: string;\n}\n\nconst hasSocketProtocol = (url: string | URL) =>\n /wss?:\\/\\//.test(url.toString());\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n podExecTerminal: {\n width: '100%',\n height: '100%',\n '& .xterm-screen': { padding: theme.spacing(1) },\n },\n }),\n);\n\n/**\n * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it\n *\n * @public\n */\nexport const PodExecTerminal = (props: PodExecTerminalProps) => {\n const classes = useStyles();\n const { containerName, podNamespace, podName } = props;\n\n const [baseUrl, setBaseUrl] = useState(window.location.host);\n\n const terminalRef = React.useRef(null);\n const discoveryApi = useApi(discoveryApiRef);\n const namespace = podNamespace ?? 'default';\n\n useEffect(() => {\n discoveryApi\n .getBaseUrl('kubernetes')\n .then(url => url ?? window.location.host)\n .then(url => url.replace(/^http(s?):\\/\\//, 'ws$1://'))\n .then(url => setBaseUrl(url));\n }, [discoveryApi]);\n\n const urlParams = useMemo(() => {\n const params = new URLSearchParams({\n container: containerName,\n stdin: 'true',\n stdout: 'true',\n stderr: 'true',\n tty: 'true',\n command: '/bin/sh',\n });\n return params;\n }, [containerName]);\n\n const socketUrl = useMemo(() => {\n if (!hasSocketProtocol(baseUrl)) {\n return '';\n }\n\n return new URL(\n `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`,\n );\n }, [baseUrl, namespace, podName, urlParams]);\n\n useEffect(() => {\n if (!hasSocketProtocol(socketUrl)) {\n return () => {};\n }\n\n const terminal = new Terminal();\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n if (terminalRef.current) {\n terminal.open(terminalRef.current);\n fitAddon.fit();\n }\n\n terminal.writeln('Starting terminal, please wait...');\n\n const socket = new WebSocket(socketUrl, ['channel.k8s.io']);\n\n socket.onopen = () => {\n terminal.clear();\n const attachAddon = new PodExecTerminalAttachAddon(socket, {\n bidirectional: true,\n });\n\n terminal.loadAddon(attachAddon);\n };\n\n socket.onclose = () => {\n terminal.writeln('Socket connection closed');\n };\n\n return () => {\n terminal?.clear();\n socket?.close();\n };\n }, [baseUrl, socketUrl]);\n\n return (\n <div\n data-testid=\"terminal\"\n ref={terminalRef}\n className={classes.podExecTerminal}\n />\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { AttachAddon } from 'xterm-addon-attach';
2
+
3
+ var __accessCheck = (obj, member, msg) => {
4
+ if (!member.has(obj))
5
+ throw TypeError("Cannot " + msg);
6
+ };
7
+ var __privateGet = (obj, member, getter) => {
8
+ __accessCheck(obj, member, "read from private field");
9
+ return member.get(obj);
10
+ };
11
+ var __privateAdd = (obj, member, value) => {
12
+ if (member.has(obj))
13
+ throw TypeError("Cannot add the same private member more than once");
14
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
15
+ };
16
+ var _textEncoder;
17
+ class PodExecTerminalAttachAddon extends AttachAddon {
18
+ constructor(socket, options) {
19
+ super(socket, options);
20
+ __privateAdd(this, _textEncoder, new TextEncoder());
21
+ const thisAddon = this;
22
+ thisAddon._sendBinary = (data) => {
23
+ if (!thisAddon._checkOpenSocket()) {
24
+ return;
25
+ }
26
+ const buffer = Uint8Array.from([0, ...__privateGet(this, _textEncoder).encode(data)]);
27
+ thisAddon._socket.send(buffer);
28
+ };
29
+ thisAddon._sendData = (data) => {
30
+ if (!thisAddon._checkOpenSocket()) {
31
+ return;
32
+ }
33
+ thisAddon._sendBinary(data);
34
+ };
35
+ }
36
+ }
37
+ _textEncoder = new WeakMap();
38
+
39
+ export { PodExecTerminalAttachAddon };
40
+ //# sourceMappingURL=PodExecTerminalAttachAddon.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PodExecTerminalAttachAddon.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminalAttachAddon.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 { AttachAddon, IAttachOptions } from 'xterm-addon-attach';\n\nexport class PodExecTerminalAttachAddon extends AttachAddon {\n #textEncoder = new TextEncoder();\n\n constructor(socket: WebSocket, options?: IAttachOptions) {\n super(socket, options);\n\n const thisAddon = this as any;\n\n // These methods are private in the original AttachAddon,\n // thus have to override at runtime like this\n thisAddon._sendBinary = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n const buffer = Uint8Array.from([0, ...this.#textEncoder.encode(data)]);\n\n thisAddon._socket.send(buffer);\n };\n\n thisAddon._sendData = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n thisAddon._sendBinary(data);\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,IAAA,YAAA,CAAA;AAiBO,MAAM,mCAAmC,WAAY,CAAA;AAAA,EAG1D,WAAA,CAAY,QAAmB,OAA0B,EAAA;AACvD,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA;AAHvB,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,EAAe,IAAI,WAAY,EAAA,CAAA,CAAA;AAK7B,IAAA,MAAM,SAAY,GAAA,IAAA,CAAA;AAIlB,IAAU,SAAA,CAAA,WAAA,GAAc,CAAC,IAAiB,KAAA;AACxC,MAAI,IAAA,CAAC,SAAU,CAAA,gBAAA,EAAoB,EAAA;AACjC,QAAA,OAAA;AAAA,OACF;AAEA,MAAM,MAAA,MAAA,GAAS,UAAW,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,YAAA,CAAA,IAAA,EAAK,YAAa,CAAA,CAAA,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA,CAAA;AAErE,MAAU,SAAA,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA,CAAA;AAAA,KAC/B,CAAA;AAEA,IAAU,SAAA,CAAA,SAAA,GAAY,CAAC,IAAiB,KAAA;AACtC,MAAI,IAAA,CAAC,SAAU,CAAA,gBAAA,EAAoB,EAAA;AACjC,QAAA,OAAA;AAAA,OACF;AAEA,MAAA,SAAA,CAAU,YAAY,IAAI,CAAA,CAAA;AAAA,KAC5B,CAAA;AAAA,GACF;AACF,CAAA;AA3BE,YAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -0,0 +1,35 @@
1
+ import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';
2
+ import React__default from 'react';
3
+ import { KubernetesDialog } from '../KubernetesDialog/KubernetesDialog.esm.js';
4
+ import '@backstage/core-plugin-api';
5
+ import { useIsPodExecTerminalSupported } from '../../hooks/useIsPodExecTerminalSupported.esm.js';
6
+ import 'react-use/esm/useInterval';
7
+ import 'react-use/esm/useAsyncRetry';
8
+ import '../../kubernetes-auth-provider/types.esm.js';
9
+ import '../../api/types.esm.js';
10
+ import '../../hooks/PodNamesWithErrors.esm.js';
11
+ import '../../hooks/PodNamesWithMetrics.esm.js';
12
+ import '../../hooks/GroupedResponses.esm.js';
13
+ import '../../hooks/Cluster.esm.js';
14
+ import '../../hooks/usePodMetrics.esm.js';
15
+ import '../../hooks/useMatchingErrors.esm.js';
16
+ import { PodExecTerminal } from './PodExecTerminal.esm.js';
17
+
18
+ const PodExecTerminalDialog = (props) => {
19
+ const { cluster, containerName, podName } = props;
20
+ const isPodExecTerminalSupported = useIsPodExecTerminalSupported();
21
+ return !isPodExecTerminalSupported.loading && isPodExecTerminalSupported.value && /* @__PURE__ */ React__default.createElement(
22
+ KubernetesDialog,
23
+ {
24
+ buttonAriaLabel: "open terminal",
25
+ buttonIcon: /* @__PURE__ */ React__default.createElement(OpenInBrowserIcon, null),
26
+ buttonText: "Terminal",
27
+ disabled: isPodExecTerminalSupported.loading || !isPodExecTerminalSupported.value,
28
+ title: `${podName} - ${containerName} terminal shell on cluster ${cluster.title || cluster.name}`
29
+ },
30
+ /* @__PURE__ */ React__default.createElement(PodExecTerminal, { ...props })
31
+ );
32
+ };
33
+
34
+ export { PodExecTerminalDialog };
35
+ //# sourceMappingURL=PodExecTerminalDialog.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PodExecTerminalDialog.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminalDialog.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 */\n\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport React from 'react';\n\nimport { KubernetesDialog } from '../KubernetesDialog';\nimport { useIsPodExecTerminalSupported } from '../../hooks';\nimport { PodExecTerminal, PodExecTerminalProps } from './PodExecTerminal';\n\n/**\n * Opens a terminal connected to the given pod's container in a dialog\n *\n * @public\n */\nexport const PodExecTerminalDialog = (props: PodExecTerminalProps) => {\n const { cluster, containerName, podName } = props;\n\n const isPodExecTerminalSupported = useIsPodExecTerminalSupported();\n\n return (\n !isPodExecTerminalSupported.loading &&\n isPodExecTerminalSupported.value && (\n <KubernetesDialog\n buttonAriaLabel=\"open terminal\"\n buttonIcon={<OpenInBrowserIcon />}\n buttonText=\"Terminal\"\n disabled={\n isPodExecTerminalSupported.loading ||\n !isPodExecTerminalSupported.value\n }\n title={`${podName} - ${containerName} terminal shell on cluster ${\n cluster.title || cluster.name\n }`}\n >\n <PodExecTerminal {...props} />\n </KubernetesDialog>\n )\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;AA4Ba,MAAA,qBAAA,GAAwB,CAAC,KAAgC,KAAA;AACpE,EAAA,MAAM,EAAE,OAAA,EAAS,aAAe,EAAA,OAAA,EAAY,GAAA,KAAA,CAAA;AAE5C,EAAA,MAAM,6BAA6B,6BAA8B,EAAA,CAAA;AAEjE,EAAA,OACE,CAAC,0BAAA,CAA2B,OAC5B,IAAA,0BAAA,CAA2B,KACzB,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,eAAgB,EAAA,eAAA;AAAA,MAChB,UAAA,+CAAa,iBAAkB,EAAA,IAAA,CAAA;AAAA,MAC/B,UAAW,EAAA,UAAA;AAAA,MACX,QACE,EAAA,0BAAA,CAA2B,OAC3B,IAAA,CAAC,0BAA2B,CAAA,KAAA;AAAA,MAE9B,KAAA,EAAO,GAAG,OAAO,CAAA,GAAA,EAAM,aAAa,CAClC,2BAAA,EAAA,OAAA,CAAQ,KAAS,IAAA,OAAA,CAAQ,IAC3B,CAAA,CAAA;AAAA,KAAA;AAAA,oBAEAA,cAAA,CAAA,aAAA,CAAC,eAAiB,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA;AAAA,GAC9B,CAAA;AAGN;;;;"}
@@ -0,0 +1,52 @@
1
+ import React__default from 'react';
2
+ import List from '@material-ui/core/List';
3
+ import ListItem from '@material-ui/core/ListItem';
4
+ import ListItemText from '@material-ui/core/ListItemText';
5
+ import Divider from '@material-ui/core/Divider';
6
+ import Paper from '@material-ui/core/Paper';
7
+ import Grid from '@material-ui/core/Grid';
8
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
9
+ import { FixDialog } from '../FixDialog/FixDialog.esm.js';
10
+
11
+ const useStyles = makeStyles(
12
+ (_theme) => createStyles({
13
+ root: {
14
+ overflow: "auto"
15
+ },
16
+ list: {
17
+ width: "100%"
18
+ }
19
+ })
20
+ );
21
+ const ErrorList = ({ podAndErrors }) => {
22
+ const classes = useStyles();
23
+ return /* @__PURE__ */ React__default.createElement(Paper, { className: classes.root }, /* @__PURE__ */ React__default.createElement(List, { className: classes.list }, podAndErrors.filter((pae) => pae.errors.length > 0).flatMap((onlyPodWithErrors) => {
24
+ return onlyPodWithErrors.errors.map((error, i) => {
25
+ var _a, _b, _c;
26
+ return /* @__PURE__ */ React__default.createElement(
27
+ React__default.Fragment,
28
+ {
29
+ key: `${(_b = (_a = onlyPodWithErrors.pod.metadata) == null ? void 0 : _a.name) != null ? _b : "unknown"}-eli-${i}`
30
+ },
31
+ i > 0 && /* @__PURE__ */ React__default.createElement(Divider, { key: `error-divider${i}` }),
32
+ /* @__PURE__ */ React__default.createElement(ListItem, null, /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
33
+ ListItemText,
34
+ {
35
+ primary: error.message,
36
+ secondary: (_c = onlyPodWithErrors.pod.metadata) == null ? void 0 : _c.name
37
+ }
38
+ )), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React__default.createElement(
39
+ FixDialog,
40
+ {
41
+ pod: onlyPodWithErrors.pod,
42
+ error,
43
+ clusterName: onlyPodWithErrors.cluster.name
44
+ }
45
+ ))))
46
+ );
47
+ });
48
+ })));
49
+ };
50
+
51
+ export { ErrorList };
52
+ //# sourceMappingURL=ErrorList.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorList.esm.js","sources":["../../../../src/components/Pods/ErrorList/ErrorList.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 React from 'react';\n\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Divider from '@material-ui/core/Divider';\nimport Paper from '@material-ui/core/Paper';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.cluster.name}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,WAC5B,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,QAAU,EAAA,MAAA;AAAA,KACZ;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAO,EAAA,MAAA;AAAA,KACT;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAgBO,MAAM,SAAY,GAAA,CAAC,EAAE,YAAA,EAAmC,KAAA;AAC7D,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,oDACG,KAAM,EAAA,EAAA,SAAA,EAAW,QAAQ,IACxB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,SAAW,EAAA,OAAA,CAAQ,QACtB,YACE,CAAA,MAAA,CAAO,SAAO,GAAI,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CACnC,QAAQ,CAAqB,iBAAA,KAAA;AAC5B,IAAA,OAAO,iBAAkB,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,OAAO,CAAM,KAAA;AA5D9D,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6Dc,MACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,QAACA,cAAM,CAAA,QAAA;AAAA,QAAN;AAAA,UACC,GAAA,EAAK,CACH,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,iBAAA,CAAkB,GAAI,CAAA,QAAA,KAAtB,mBAAgC,IAAhC,KAAA,IAAA,GAAA,EAAA,GAAwC,SAC1C,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA;AAAA,SAAA;AAAA,QAER,IAAI,CAAK,oBAAAA,cAAA,CAAA,aAAA,CAAC,WAAQ,GAAK,EAAA,CAAA,aAAA,EAAgB,CAAC,CAAI,CAAA,EAAA,CAAA;AAAA,wBAC7CA,cAAA,CAAA,aAAA,CAAC,QACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,SAAS,KAAM,CAAA,OAAA;AAAA,YACf,SAAW,EAAA,CAAA,EAAA,GAAA,iBAAA,CAAkB,GAAI,CAAA,QAAA,KAAtB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,WAAA;AAAA,SAE/C,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAK,iBAAkB,CAAA,GAAA;AAAA,YACvB,KAAA;AAAA,YACA,WAAA,EAAa,kBAAkB,OAAQ,CAAA,IAAA;AAAA,WAAA;AAAA,SAE3C,CACF,CACF,CAAA;AAAA,OACF,CAAA;AAAA,KAEH,CAAA,CAAA;AAAA,GACF,CACL,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,74 @@
1
+ import React__default from 'react';
2
+ import Avatar from '@material-ui/core/Avatar';
3
+ import Container from '@material-ui/core/Container';
4
+ import Grid from '@material-ui/core/Grid';
5
+ import List from '@material-ui/core/List';
6
+ import ListItem from '@material-ui/core/ListItem';
7
+ import ListItemAvatar from '@material-ui/core/ListItemAvatar';
8
+ import ListItemText from '@material-ui/core/ListItemText';
9
+ import Tooltip from '@material-ui/core/Tooltip';
10
+ import Typography from '@material-ui/core/Typography';
11
+ import InfoIcon from '@material-ui/icons/Info';
12
+ import WarningIcon from '@material-ui/icons/Warning';
13
+ import { DateTime } from 'luxon';
14
+ import { useEvents } from './useEvents.esm.js';
15
+ import Skeleton from '@material-ui/lab/Skeleton';
16
+ import { DismissableBanner } from '@backstage/core-components';
17
+
18
+ const getAvatarByType = (type) => {
19
+ return /* @__PURE__ */ React__default.createElement(ListItemAvatar, null, /* @__PURE__ */ React__default.createElement(Avatar, null, type === "Warning" ? /* @__PURE__ */ React__default.createElement(WarningIcon, null) : /* @__PURE__ */ React__default.createElement(InfoIcon, null)));
20
+ };
21
+ const EventsContent = ({
22
+ events,
23
+ warningEventsOnly
24
+ }) => {
25
+ if (events.length === 0) {
26
+ return /* @__PURE__ */ React__default.createElement(Typography, null, "No events found");
27
+ }
28
+ return /* @__PURE__ */ React__default.createElement(Container, null, /* @__PURE__ */ React__default.createElement(Grid, null, /* @__PURE__ */ React__default.createElement(List, null, events.filter((event) => {
29
+ if (warningEventsOnly) {
30
+ return event.type === "Warning";
31
+ }
32
+ return true;
33
+ }).map((event) => {
34
+ var _a;
35
+ const timeAgo = event.metadata.creationTimestamp ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(
36
+ {
37
+ locale: "en"
38
+ }
39
+ ) : "unknown";
40
+ return /* @__PURE__ */ React__default.createElement(ListItem, { key: event.metadata.name }, /* @__PURE__ */ React__default.createElement(Tooltip, { title: `${(_a = event.type) != null ? _a : ""} event` }, getAvatarByType(event.type)), /* @__PURE__ */ React__default.createElement(
41
+ ListItemText,
42
+ {
43
+ primary: `First event ${timeAgo} (count: ${event.count})`,
44
+ secondary: `${event.reason}: ${event.message}`
45
+ }
46
+ ));
47
+ }))));
48
+ };
49
+ const Events = ({
50
+ involvedObjectName,
51
+ namespace,
52
+ clusterName,
53
+ warningEventsOnly
54
+ }) => {
55
+ const { value, error, loading } = useEvents({
56
+ involvedObjectName,
57
+ namespace,
58
+ clusterName
59
+ });
60
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, error && /* @__PURE__ */ React__default.createElement(
61
+ DismissableBanner,
62
+ {
63
+ ...{
64
+ message: error.message,
65
+ variant: "error",
66
+ fixed: false
67
+ },
68
+ id: "events"
69
+ }
70
+ ), loading && /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rect", width: "100%", height: "100%" }), !loading && value !== void 0 && /* @__PURE__ */ React__default.createElement(EventsContent, { warningEventsOnly, events: value }));
71
+ };
72
+
73
+ export { Events, EventsContent };
74
+ //# sourceMappingURL=Events.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Events.esm.js","sources":["../../../../src/components/Pods/Events/Events.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 React from 'react';\n\nimport Avatar from '@material-ui/core/Avatar';\nimport Container from '@material-ui/core/Container';\nimport Grid from '@material-ui/core/Grid';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport Skeleton from '@material-ui/lab/Skeleton';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { useApi } from '@backstage/core-plugin-api';
2
+ import useAsync from 'react-use/esm/useAsync';
3
+ import { kubernetesProxyApiRef } from '../../../api/types.esm.js';
4
+
5
+ const useEvents = ({
6
+ involvedObjectName,
7
+ namespace,
8
+ clusterName
9
+ }) => {
10
+ const kubernetesProxyApi = useApi(kubernetesProxyApiRef);
11
+ return useAsync(async () => {
12
+ return await kubernetesProxyApi.getEventsByInvolvedObjectName({
13
+ involvedObjectName,
14
+ namespace,
15
+ clusterName
16
+ });
17
+ }, [involvedObjectName, namespace, clusterName]);
18
+ };
19
+
20
+ export { useEvents };
21
+ //# sourceMappingURL=useEvents.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEvents.esm.js","sources":["../../../../src/components/Pods/Events/useEvents.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 { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { kubernetesProxyApiRef } from '../../../api/types';\n\n/**\n * Arguments for useEvents\n *\n * @public\n */\nexport interface EventsOptions {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n}\n\n/**\n * Retrieves the events for the given object\n *\n * @public\n */\nexport const useEvents = ({\n involvedObjectName,\n namespace,\n clusterName,\n}: EventsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getEventsByInvolvedObjectName({\n involvedObjectName,\n namespace,\n clusterName,\n });\n }, [involvedObjectName, namespace, clusterName]);\n};\n"],"names":[],"mappings":";;;;AAmCO,MAAM,YAAY,CAAC;AAAA,EACxB,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AACF,CAAqB,KAAA;AACnB,EAAM,MAAA,kBAAA,GAAqB,OAAO,qBAAqB,CAAA,CAAA;AACvD,EAAA,OAAO,SAAS,YAAY;AAC1B,IAAO,OAAA,MAAM,mBAAmB,6BAA8B,CAAA;AAAA,MAC5D,kBAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,kBAAoB,EAAA,SAAA,EAAW,WAAW,CAAC,CAAA,CAAA;AACjD;;;;"}
@@ -0,0 +1,107 @@
1
+ import React__default, { useState } from 'react';
2
+ import Button from '@material-ui/core/Button';
3
+ import Grid from '@material-ui/core/Grid';
4
+ import Dialog from '@material-ui/core/Dialog';
5
+ import DialogActions from '@material-ui/core/DialogActions';
6
+ import DialogContent from '@material-ui/core/DialogContent';
7
+ import DialogTitle from '@material-ui/core/DialogTitle';
8
+ import IconButton from '@material-ui/core/IconButton';
9
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
10
+ import Typography from '@material-ui/core/Typography';
11
+ import CloseIcon from '@material-ui/icons/Close';
12
+ import HelpIcon from '@material-ui/icons/Help';
13
+ import OpenInNewIcon from '@material-ui/icons/OpenInNew';
14
+ import { PodLogs } from '../PodLogs/PodLogs.esm.js';
15
+ import '@material-ui/icons/Subject';
16
+ import '../../KubernetesDialog/KubernetesDialog.esm.js';
17
+ import 'react-use/esm/useAsync';
18
+ import '@backstage/core-plugin-api';
19
+ import '../../../api/types.esm.js';
20
+ import { Events } from '../Events/Events.esm.js';
21
+ import { LinkButton } from '@backstage/core-components';
22
+
23
+ const useStyles = makeStyles(
24
+ (theme) => createStyles({
25
+ closeButton: {
26
+ position: "absolute",
27
+ right: theme.spacing(1),
28
+ top: theme.spacing(1),
29
+ color: theme.palette.grey[500]
30
+ }
31
+ })
32
+ );
33
+ const FixDialog = ({
34
+ open,
35
+ pod,
36
+ error,
37
+ clusterName
38
+ }) => {
39
+ var _a;
40
+ const [isOpen, setOpen] = useState(!!open);
41
+ const classes = useStyles();
42
+ const openDialog = () => {
43
+ setOpen(true);
44
+ };
45
+ const closeDialog = () => {
46
+ setOpen(false);
47
+ };
48
+ const pf = error.proposedFix;
49
+ const dialogContent = () => {
50
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
51
+ return /* @__PURE__ */ React__default.createElement(Grid, { container: true }, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Detected error:"), /* @__PURE__ */ React__default.createElement(Typography, null, error.message)), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Cause explanation:"), /* @__PURE__ */ React__default.createElement(Typography, null, (_b = (_a2 = error.proposedFix) == null ? void 0 : _a2.rootCauseExplanation) != null ? _b : "unknown")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Fix:"), /* @__PURE__ */ React__default.createElement(Typography, null, /* @__PURE__ */ React__default.createElement("ul", null, ((_d = (_c = error.proposedFix) == null ? void 0 : _c.actions) != null ? _d : []).map((fix, i) => {
52
+ var _a3, _b2;
53
+ return /* @__PURE__ */ React__default.createElement("li", { key: `${(_b2 = (_a3 = pod.metadata) == null ? void 0 : _a3.name) != null ? _b2 : "unknown"}-pf-${i}` }, fix);
54
+ })))), pf && pf.type === "logs" && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Crash logs:")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
55
+ PodLogs,
56
+ {
57
+ previous: true,
58
+ containerScope: {
59
+ podName: (_f = (_e = pod.metadata) == null ? void 0 : _e.name) != null ? _f : "unknown",
60
+ podNamespace: (_h = (_g = pod.metadata) == null ? void 0 : _g.namespace) != null ? _h : "unknown",
61
+ cluster: { name: clusterName },
62
+ containerName: pf.container
63
+ }
64
+ }
65
+ ))), pf && pf.type === "events" && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6" }, "Events:")), /* @__PURE__ */ React__default.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React__default.createElement(
66
+ Events,
67
+ {
68
+ warningEventsOnly: true,
69
+ involvedObjectName: (_j = (_i = pod.metadata) == null ? void 0 : _i.name) != null ? _j : "",
70
+ namespace: (_l = (_k = pod.metadata) == null ? void 0 : _k.namespace) != null ? _l : "",
71
+ clusterName
72
+ }
73
+ ))));
74
+ };
75
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
76
+ Button,
77
+ {
78
+ variant: "outlined",
79
+ "aria-label": "fix issue",
80
+ component: "label",
81
+ onClick: openDialog,
82
+ startIcon: /* @__PURE__ */ React__default.createElement(HelpIcon, null)
83
+ },
84
+ "Help"
85
+ ), /* @__PURE__ */ React__default.createElement(Dialog, { maxWidth: "xl", fullWidth: true, open: isOpen, onClose: closeDialog }, /* @__PURE__ */ React__default.createElement(DialogTitle, { id: "dialog-title" }, (_a = pod.metadata) == null ? void 0 : _a.name, " - ", error.type, /* @__PURE__ */ React__default.createElement(
86
+ IconButton,
87
+ {
88
+ "aria-label": "close",
89
+ className: classes.closeButton,
90
+ onClick: closeDialog
91
+ },
92
+ /* @__PURE__ */ React__default.createElement(CloseIcon, null)
93
+ )), /* @__PURE__ */ React__default.createElement(DialogContent, null, dialogContent()), /* @__PURE__ */ React__default.createElement(DialogActions, null, pf && pf.type === "docs" && /* @__PURE__ */ React__default.createElement(
94
+ LinkButton,
95
+ {
96
+ to: pf.docsLink,
97
+ variant: "outlined",
98
+ startIcon: /* @__PURE__ */ React__default.createElement(OpenInNewIcon, null),
99
+ target: "_blank",
100
+ rel: "noopener"
101
+ },
102
+ "Open docs"
103
+ ))));
104
+ };
105
+
106
+ export { FixDialog };
107
+ //# sourceMappingURL=FixDialog.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FixDialog.esm.js","sources":["../../../../src/components/Pods/FixDialog/FixDialog.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 React, { useState } from 'react';\n\nimport Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '@backstage/plugin-kubernetes-common';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n cluster: { name: clusterName },\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":["_a","React","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAO,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,KAC/B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAmBO,MAAM,YAAsC,CAAC;AAAA,EAClD,IAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AACF,CAAsB,KAAA;AArEtB,EAAA,IAAA,EAAA,CAAA;AAsEE,EAAA,MAAM,CAAC,MAAQ,EAAA,OAAO,IAAI,QAAS,CAAA,CAAC,CAAC,IAAI,CAAA,CAAA;AACzC,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GACf,CAAA;AAEA,EAAA,MAAM,KAAK,KAAM,CAAA,WAAA,CAAA;AAEjB,EAAA,MAAM,gBAAgB,MAAM;AAnF9B,IAAA,IAAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAoFI,IAAA,uBACGC,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAA,+CACZ,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,iBAAe,CACxC,kBAAAA,cAAA,CAAA,aAAA,CAAC,UAAY,EAAA,IAAA,EAAA,KAAA,CAAM,OAAQ,CAC7B,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,+CACZ,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,EAAA,oBAAkB,mBAC1CA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA,EAAA,CACE,EAAAD,GAAAA,CAAAA,GAAAA,GAAA,KAAM,CAAA,WAAA,KAAN,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAmB,yBAAnB,IAA2C,GAAA,EAAA,GAAA,SAC9C,CACF,CAAA,+CACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZC,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,MAAI,CAC7B,kBAAAA,cAAA,CAAA,aAAA,CAAC,UACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,cACG,EAAM,GAAA,CAAA,EAAA,GAAA,KAAA,CAAA,WAAA,KAAN,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,KAAnB,YAA8B,EAAC,EAAG,GAAI,CAAA,CAAC,KAAK,CAAM,KAAA;AApGlE,MAAA,IAAAD,GAAAE,EAAAA,GAAAA,CAAAA;AAqGgB,MAAA,oDACG,IAAG,EAAA,EAAA,GAAA,EAAK,CAAGA,EAAAA,CAAAA,GAAAA,GAAAA,CAAAF,MAAA,GAAI,CAAA,QAAA,KAAJ,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,GAAAA,CAAc,SAAd,IAAAE,GAAAA,GAAAA,GAAsB,SAAS,CAAO,IAAA,EAAA,CAAC,MAChD,GACH,CAAA,CAAA;AAAA,KAEH,CACH,CACF,CACF,CAEC,EAAA,EAAA,IAAM,EAAG,CAAA,IAAA,KAAS,MACjB,oBAAAD,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,aAAW,CACtC,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,QAAQ,EAAA,IAAA;AAAA,QACR,cAAgB,EAAA;AAAA,UACd,OAAS,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,SAAA;AAAA,UAC/B,YAAc,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,SAAA;AAAA,UACzC,OAAA,EAAS,EAAE,IAAA,EAAM,WAAY,EAAA;AAAA,UAC7B,eAAe,EAAG,CAAA,SAAA;AAAA,SACpB;AAAA,OAAA;AAAA,KAEJ,CACF,CAAA,EAED,EAAM,IAAA,EAAA,CAAG,IAAS,KAAA,QAAA,oBAEfA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,sBACZA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,SAAO,CAClC,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACb,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,iBAAiB,EAAA,IAAA;AAAA,QACjB,kBAAoB,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,IAAsB,GAAA,EAAA,GAAA,EAAA;AAAA,QAC1C,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,QAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,cAAd,IAA2B,GAAA,EAAA,GAAA,EAAA;AAAA,QACtC,WAAA;AAAA,OAAA;AAAA,KAEJ,CACF,CAEJ,CAAA,CAAA;AAAA,GAEJ,CAAA;AAEA,EAAA,uBAEIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,YAAW,EAAA,WAAA;AAAA,MACX,SAAU,EAAA,OAAA;AAAA,MACV,OAAS,EAAA,UAAA;AAAA,MACT,SAAA,+CAAY,QAAS,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,IACtB,MAAA;AAAA,GAED,+CACC,MAAO,EAAA,EAAA,QAAA,EAAS,MAAK,SAAS,EAAA,IAAA,EAAC,MAAM,MAAQ,EAAA,OAAA,EAAS,+BACpDA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,IAAG,cACb,EAAA,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,aAAJ,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAK,KAAI,EAAA,KAAA,CAAM,IAC9B,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MACX,WAAW,OAAQ,CAAA,WAAA;AAAA,MACnB,OAAS,EAAA,WAAA;AAAA,KAAA;AAAA,iDAER,SAAU,EAAA,IAAA,CAAA;AAAA,GAEf,CAAA,kBACCA,cAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAe,aAAc,EAAE,CAChC,kBAAAA,cAAA,CAAA,aAAA,CAAC,aACE,EAAA,IAAA,EAAA,EAAA,IAAM,EAAG,CAAA,IAAA,KAAS,MACjB,oBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAI,EAAG,CAAA,QAAA;AAAA,MACP,OAAQ,EAAA,UAAA;AAAA,MACR,SAAA,+CAAY,aAAc,EAAA,IAAA,CAAA;AAAA,MAC1B,MAAO,EAAA,QAAA;AAAA,MACP,GAAI,EAAA,UAAA;AAAA,KAAA;AAAA,IACL,WAAA;AAAA,GAIL,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}