@backstage/plugin-kubernetes-react 0.5.23 → 0.5.24-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/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage/plugin-kubernetes-react
2
2
 
3
+ ## 0.5.24-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 83f34f2: The pod exec terminal now loads `@xterm/xterm` and its stylesheet when a terminal is opened, instead of including them in the initial bundle.
8
+ - Updated dependencies
9
+ - @backstage/core-components@0.18.14-next.1
10
+ - @backstage/core-plugin-api@1.12.10-next.0
11
+
12
+ ## 0.5.24-next.0
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies
17
+ - @backstage/plugin-kubernetes-common@0.9.13-next.0
18
+ - @backstage/core-components@0.18.14-next.0
19
+
3
20
  ## 0.5.23
4
21
 
5
22
  ### Patch Changes
@@ -1,89 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import '@xterm/xterm/css/xterm.css';
3
- import { useApi, discoveryApiRef } from '@backstage/core-plugin-api';
4
- import { makeStyles, createStyles } from '@material-ui/core/styles';
5
- import { useState, useRef, useEffect, useMemo } from 'react';
6
- import { Terminal } from '@xterm/xterm';
7
- import { FitAddon } from '@xterm/addon-fit';
8
- import { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon.esm.js';
2
+ import { Progress } from '@backstage/core-components';
3
+ import { lazy, Suspense } from 'react';
9
4
 
10
- const hasSocketProtocol = (url) => /wss?:\/\//.test(url.toString());
11
- const useStyles = makeStyles(
12
- (theme) => createStyles({
13
- podExecTerminal: {
14
- width: "100%",
15
- height: "100%",
16
- "& .xterm-screen": { padding: theme.spacing(1) }
17
- }
18
- })
5
+ const LazyPodExecTerminalContent = lazy(
6
+ () => import('./PodExecTerminalContent.esm.js').then((m) => ({
7
+ default: m.PodExecTerminalContent
8
+ }))
19
9
  );
20
- const PodExecTerminal = (props) => {
21
- const classes = useStyles();
22
- const { containerName, podNamespace, podName } = props;
23
- const [baseUrl, setBaseUrl] = useState(window.location.host);
24
- const terminalRef = useRef(null);
25
- const discoveryApi = useApi(discoveryApiRef);
26
- const namespace = podNamespace ?? "default";
27
- useEffect(() => {
28
- discoveryApi.getBaseUrl("kubernetes").then((url) => url ?? window.location.host).then((url) => url.replace(/^http(s?):\/\//, "ws$1://")).then((url) => setBaseUrl(url));
29
- }, [discoveryApi]);
30
- const urlParams = useMemo(() => {
31
- const params = new URLSearchParams({
32
- container: containerName,
33
- stdin: "true",
34
- stdout: "true",
35
- stderr: "true",
36
- tty: "true",
37
- command: "/bin/sh"
38
- });
39
- return params;
40
- }, [containerName]);
41
- const socketUrl = useMemo(() => {
42
- if (!hasSocketProtocol(baseUrl)) {
43
- return "";
44
- }
45
- return new URL(
46
- `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`
47
- );
48
- }, [baseUrl, namespace, podName, urlParams]);
49
- useEffect(() => {
50
- if (!hasSocketProtocol(socketUrl)) {
51
- return () => {
52
- };
53
- }
54
- const terminal = new Terminal();
55
- const fitAddon = new FitAddon();
56
- terminal.loadAddon(fitAddon);
57
- if (terminalRef.current) {
58
- terminal.open(terminalRef.current);
59
- fitAddon.fit();
60
- }
61
- terminal.writeln("Starting terminal, please wait...");
62
- const socket = new WebSocket(socketUrl, ["channel.k8s.io"]);
63
- socket.onopen = () => {
64
- terminal.clear();
65
- const attachAddon = new PodExecTerminalAttachAddon(socket, {
66
- bidirectional: true
67
- });
68
- terminal.loadAddon(attachAddon);
69
- };
70
- socket.onclose = () => {
71
- terminal.writeln("Socket connection closed");
72
- };
73
- return () => {
74
- terminal?.clear();
75
- socket?.close();
76
- };
77
- }, [baseUrl, socketUrl]);
78
- return /* @__PURE__ */ jsx(
79
- "div",
80
- {
81
- "data-testid": "terminal",
82
- ref: terminalRef,
83
- className: classes.podExecTerminal
84
- }
85
- );
86
- };
10
+ const PodExecTerminal = (props) => /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Progress, {}), children: /* @__PURE__ */ jsx(LazyPodExecTerminalContent, { ...props }) });
87
11
 
88
12
  export { PodExecTerminal };
89
13
  //# sourceMappingURL=PodExecTerminal.esm.js.map
@@ -1 +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/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 { useRef, useEffect, useMemo, useState } from 'react';\nimport { Terminal } from '@xterm/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 = 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":[],"mappings":"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"}
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 */\n\nimport { Progress } from '@backstage/core-components';\nimport { lazy, Suspense } from 'react';\nimport type { PodExecTerminalProps } from './PodExecTerminalContent';\n\nexport type { PodExecTerminalProps } from './PodExecTerminalContent';\n\n// @xterm/xterm and related CSS are large; only load them when a terminal mounts.\nconst LazyPodExecTerminalContent = lazy(() =>\n import('./PodExecTerminalContent').then(m => ({\n default: m.PodExecTerminalContent,\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 <Suspense fallback={<Progress />}>\n <LazyPodExecTerminalContent {...props} />\n </Suspense>\n);\n"],"names":[],"mappings":";;;;AAuBA,MAAM,0BAAA,GAA6B,IAAA;AAAA,EAAK,MACtC,OAAO,iCAA0B,CAAA,CAAE,KAAK,CAAA,CAAA,MAAM;AAAA,IAC5C,SAAS,CAAA,CAAE;AAAA,GACb,CAAE;AACJ,CAAA;AAOO,MAAM,eAAA,GAAkB,CAAC,KAAA,qBAC9B,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,kBAAU,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EAC5B,QAAA,kBAAA,GAAA,CAAC,0BAAA,EAAA,EAA4B,GAAG,OAAO,CAAA,EACzC;;;;"}
@@ -0,0 +1,89 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import '@xterm/xterm/css/xterm.css';
3
+ import { useApi, discoveryApiRef } from '@backstage/core-plugin-api';
4
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
5
+ import { useState, useRef, useEffect, useMemo } from 'react';
6
+ import { Terminal } from '@xterm/xterm';
7
+ import { FitAddon } from '@xterm/addon-fit';
8
+ import { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon.esm.js';
9
+
10
+ const hasSocketProtocol = (url) => /wss?:\/\//.test(url.toString());
11
+ const useStyles = makeStyles(
12
+ (theme) => createStyles({
13
+ podExecTerminal: {
14
+ width: "100%",
15
+ height: "100%",
16
+ "& .xterm-screen": { padding: theme.spacing(1) }
17
+ }
18
+ })
19
+ );
20
+ const PodExecTerminalContent = (props) => {
21
+ const classes = useStyles();
22
+ const { containerName, podNamespace, podName } = props;
23
+ const [baseUrl, setBaseUrl] = useState(window.location.host);
24
+ const terminalRef = useRef(null);
25
+ const discoveryApi = useApi(discoveryApiRef);
26
+ const namespace = podNamespace ?? "default";
27
+ useEffect(() => {
28
+ discoveryApi.getBaseUrl("kubernetes").then((url) => url ?? window.location.host).then((url) => url.replace(/^http(s?):\/\//, "ws$1://")).then((url) => setBaseUrl(url));
29
+ }, [discoveryApi]);
30
+ const urlParams = useMemo(() => {
31
+ const params = new URLSearchParams({
32
+ container: containerName,
33
+ stdin: "true",
34
+ stdout: "true",
35
+ stderr: "true",
36
+ tty: "true",
37
+ command: "/bin/sh"
38
+ });
39
+ return params;
40
+ }, [containerName]);
41
+ const socketUrl = useMemo(() => {
42
+ if (!hasSocketProtocol(baseUrl)) {
43
+ return "";
44
+ }
45
+ return new URL(
46
+ `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`
47
+ );
48
+ }, [baseUrl, namespace, podName, urlParams]);
49
+ useEffect(() => {
50
+ if (!hasSocketProtocol(socketUrl)) {
51
+ return () => {
52
+ };
53
+ }
54
+ const terminal = new Terminal();
55
+ const fitAddon = new FitAddon();
56
+ terminal.loadAddon(fitAddon);
57
+ if (terminalRef.current) {
58
+ terminal.open(terminalRef.current);
59
+ fitAddon.fit();
60
+ }
61
+ terminal.writeln("Starting terminal, please wait...");
62
+ const socket = new WebSocket(socketUrl, ["channel.k8s.io"]);
63
+ socket.onopen = () => {
64
+ terminal.clear();
65
+ const attachAddon = new PodExecTerminalAttachAddon(socket, {
66
+ bidirectional: true
67
+ });
68
+ terminal.loadAddon(attachAddon);
69
+ };
70
+ socket.onclose = () => {
71
+ terminal.writeln("Socket connection closed");
72
+ };
73
+ return () => {
74
+ terminal?.clear();
75
+ socket?.close();
76
+ };
77
+ }, [baseUrl, socketUrl]);
78
+ return /* @__PURE__ */ jsx(
79
+ "div",
80
+ {
81
+ "data-testid": "terminal",
82
+ ref: terminalRef,
83
+ className: classes.podExecTerminal
84
+ }
85
+ );
86
+ };
87
+
88
+ export { PodExecTerminalContent };
89
+ //# sourceMappingURL=PodExecTerminalContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PodExecTerminalContent.esm.js","sources":["../../../src/components/PodExecTerminal/PodExecTerminalContent.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/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 { useRef, useEffect, useMemo, useState } from 'react';\nimport { Terminal } from '@xterm/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 * @internal\n */\nexport const PodExecTerminalContent = (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 = 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":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -880,6 +880,7 @@ interface PodExecTerminalProps {
880
880
  podName: string;
881
881
  podNamespace: string;
882
882
  }
883
+
883
884
  /**
884
885
  * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it
885
886
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-kubernetes-react",
3
- "version": "0.5.23",
3
+ "version": "0.5.24-next.1",
4
4
  "description": "Web library for the kubernetes-react plugin",
5
5
  "backstage": {
6
6
  "role": "web-library",
@@ -62,12 +62,12 @@
62
62
  "test": "backstage-cli package test"
63
63
  },
64
64
  "dependencies": {
65
- "@backstage/catalog-model": "^1.10.0",
66
- "@backstage/core-components": "^0.18.13",
67
- "@backstage/core-plugin-api": "^1.12.9",
68
- "@backstage/errors": "^1.3.1",
69
- "@backstage/plugin-kubernetes-common": "^0.9.12",
70
- "@backstage/types": "^1.2.2",
65
+ "@backstage/catalog-model": "1.10.0",
66
+ "@backstage/core-components": "0.18.14-next.1",
67
+ "@backstage/core-plugin-api": "1.12.10-next.0",
68
+ "@backstage/errors": "1.3.1",
69
+ "@backstage/plugin-kubernetes-common": "0.9.13-next.0",
70
+ "@backstage/types": "1.2.2",
71
71
  "@kubernetes-models/apimachinery": "^2.0.0",
72
72
  "@kubernetes-models/base": "^5.0.0",
73
73
  "@kubernetes/client-node": "1.4.0",
@@ -85,9 +85,10 @@
85
85
  "react-use": "^17.4.0"
86
86
  },
87
87
  "devDependencies": {
88
- "@backstage/cli": "^0.36.5",
89
- "@backstage/core-app-api": "^1.20.4",
90
- "@backstage/test-utils": "^1.7.21",
88
+ "@backstage/cli": "0.36.6-next.0",
89
+ "@backstage/core-app-api": "1.20.5-next.1",
90
+ "@backstage/test-utils": "1.7.22-next.1",
91
+ "@testing-library/dom": "^10.0.0",
91
92
  "@testing-library/jest-dom": "^6.0.0",
92
93
  "@testing-library/react": "^16.0.0",
93
94
  "@types/react": "^18.0.0",