+
+ Action Output
+
+
+
+ Action Input
+
+
+
+
+
+
+
+ );
+};
+
+export const ExecutionPanel = ({ id }: { id: string }) => {
+ const st2 = useApi(stackstormApiRef);
+
+ const { value, loading, error } = useAsync(async (): Promise => {
+ const data = await st2.getExecution(id);
+ return data;
+ }, []);
+
+ if (loading) {
+ return ;
+ } else if (error) {
+ return ;
+ }
+
+ return ;
+};
diff --git a/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.test.tsx b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.test.tsx
new file mode 100644
index 0000000000..6727f3cc56
--- /dev/null
+++ b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.test.tsx
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
+import React from 'react';
+import { Execution, StackstormApi, stackstormApiRef } from '../../api';
+import { ExecutionsTable } from './ExecutionsTable';
+
+const executions: Execution[] = [
+ {
+ id: '63dcac3e18ba00e09e7bb3b6',
+ action: {
+ name: 'post_message',
+ ref: 'chatops.post_message',
+ description: 'Post a message to stream for chatops',
+ pack: 'chatops',
+ runner_type: 'announcement',
+ id: '62fe101b11935b6aaff4ff92',
+ },
+ status: 'processing',
+ start_timestamp: new Date().toISOString(),
+ end_timestamp: new Date().toISOString(),
+ result: {},
+ parameters: {},
+ elapsed_seconds: 2.2,
+ log: [],
+ },
+ {
+ id: '62fe101b11935b6aaff4ff93',
+ action: {
+ name: 'post_result',
+ ref: 'chatops.post_result',
+ description: 'Post an execution result to stream for chatops',
+ pack: 'chatops',
+ runner_type: 'orquesta',
+ id: '62fe101b11935b6aaff4ff93',
+ },
+ status: 'succeeded',
+ start_timestamp: new Date().toISOString(),
+ end_timestamp: new Date().toISOString(),
+ result: {},
+ parameters: {},
+ elapsed_seconds: 18.5,
+ log: [],
+ },
+ {
+ id: '63dcac3c9e0b4fe98f46becc',
+ action: {
+ name: 'run',
+ ref: 'shell.run',
+ description: 'Run shell script',
+ pack: 'shell',
+ runner_type: 'shell',
+ id: '63736caac3d8557c4d61883a',
+ },
+ status: 'failed',
+ start_timestamp: new Date().toISOString(),
+ end_timestamp: new Date().toISOString(),
+ result: {},
+ parameters: {},
+ elapsed_seconds: 5.0,
+ log: [],
+ },
+];
+
+describe('ExecutionsTable', () => {
+ const mockApi: jest.Mocked = {
+ getExecutions: jest.fn().mockResolvedValue(executions),
+ getExecutionHistoryUrl: jest
+ .fn()
+ .mockResolvedValue(
+ 'http://stackstorm.example.com:8080/?#/history/123abc',
+ ),
+ } as any;
+
+ it('should render all executions', async () => {
+ const { getByText } = await renderInTestApp(
+
+
+ ,
+ );
+
+ executions.forEach(e => {
+ expect(getByText(e.id)).toBeInTheDocument();
+ expect(getByText(e.action.ref)).toBeInTheDocument();
+ expect(getByText(e.status)).toBeInTheDocument();
+ });
+ });
+});
diff --git a/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.tsx b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.tsx
new file mode 100644
index 0000000000..f034cb64e8
--- /dev/null
+++ b/plugins/stackstorm/src/components/ExecutionsTable/ExecutionsTable.tsx
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { useState } from 'react';
+import {
+ Link,
+ ResponseErrorPanel,
+ Table,
+ TableColumn,
+} from '@backstage/core-components';
+import { useApi } from '@backstage/core-plugin-api';
+import { Execution, stackstormApiRef } from '../../api';
+import { Status } from './Status';
+import { ExecutionPanel } from './ExecutionPanel';
+import useAsync from 'react-use/lib/useAsync';
+
+type DenseTableProps = {
+ executions: Execution[];
+ loading: boolean;
+ page: number;
+ pageSize: number;
+ onPageChange: (page: number) => void;
+ onRowsPerPageChange: (rows: number) => void;
+};
+
+export const DenseTable = ({
+ executions,
+ loading,
+ page,
+ pageSize,
+ onPageChange,
+ onRowsPerPageChange,
+}: DenseTableProps) => {
+ const st2 = useApi(stackstormApiRef);
+
+ const columns: TableColumn[] = [
+ {
+ title: 'Status',
+ field: 'status',
+ render: e => ,
+ },
+ {
+ title: 'Time',
+ field: 'start_timestamp',
+ render: e => `${new Date(e.start_timestamp).toUTCString()}`,
+ },
+ { title: 'Name', field: 'action.ref' },
+ {
+ title: 'Execution ID',
+ field: 'id',
+ render: e => {e.id},
+ },
+ ];
+
+ const count =
+ pageSize > executions.length
+ ? (page + 1) * pageSize + executions.length - pageSize
+ : (page + 1) * pageSize + 1;
+
+ return (
+
{
+ return ;
+ }}
+ />
+ );
+};
+
+export const ExecutionsTable = () => {
+ const st2 = useApi(stackstormApiRef);
+ const [page, setPage] = useState(0);
+ const [rowsPerPage, setRowsPerPage] = useState(10);
+
+ const { value, loading, error } = useAsync(async (): Promise => {
+ const data = await st2.getExecutions(rowsPerPage, page * rowsPerPage);
+ return data;
+ }, [page, rowsPerPage, st2]);
+
+ if (error) {
+ return ;
+ }
+
+ return (
+
+ );
+};
diff --git a/plugins/stackstorm/src/components/ExecutionsTable/Status.tsx b/plugins/stackstorm/src/components/ExecutionsTable/Status.tsx
new file mode 100644
index 0000000000..99a94df2c8
--- /dev/null
+++ b/plugins/stackstorm/src/components/ExecutionsTable/Status.tsx
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {
+ StatusOK,
+ StatusError,
+ StatusRunning,
+ StatusWarning,
+} from '@backstage/core-components';
+import React from 'react';
+
+export const Status = ({ status }: { status: string | undefined }) => {
+ if (status === undefined) return null;
+ const st = status.toLocaleLowerCase('en-US');
+ switch (status) {
+ case 'succeeded':
+ case 'enabled':
+ case 'complete':
+ return (
+ <>
+ {st}
+ >
+ );
+ case 'scheduled':
+ case 'running':
+ return (
+ <>
+ {st}
+ >
+ );
+ case 'failed':
+ case 'error':
+ return (
+ <>
+ {st}
+ >
+ );
+ default:
+ return (
+ <>
+ {st}
+ >
+ );
+ }
+};
diff --git a/plugins/stackstorm/src/components/ExecutionsTable/index.ts b/plugins/stackstorm/src/components/ExecutionsTable/index.ts
new file mode 100644
index 0000000000..402d8e557d
--- /dev/null
+++ b/plugins/stackstorm/src/components/ExecutionsTable/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { ExecutionsTable } from './ExecutionsTable';
diff --git a/plugins/stackstorm/src/components/PacksTable/PacksTable.test.tsx b/plugins/stackstorm/src/components/PacksTable/PacksTable.test.tsx
new file mode 100644
index 0000000000..9de17e2f14
--- /dev/null
+++ b/plugins/stackstorm/src/components/PacksTable/PacksTable.test.tsx
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
+import React from 'react';
+import { Pack, StackstormApi, stackstormApiRef } from '../../api';
+import { PacksTable } from './PacksTable';
+
+const packs: Pack[] = [
+ {
+ ref: 'chatops',
+ description: 'ChatOps integration pack',
+ version: '3.7.0',
+ },
+ {
+ ref: 'core',
+ description: 'Basic core actions.',
+ version: '3.7.1',
+ },
+];
+
+describe('PacksTable', () => {
+ const mockApi: jest.Mocked = {
+ getPacks: jest.fn().mockResolvedValue(packs),
+ } as any;
+
+ it('should render all packs', async () => {
+ const { getByText } = await renderInTestApp(
+
+
+ ,
+ );
+
+ packs.forEach(p => {
+ expect(getByText(p.ref)).toBeInTheDocument();
+ expect(getByText(p.description)).toBeInTheDocument();
+ expect(getByText(p.version)).toBeInTheDocument();
+ });
+ });
+});
diff --git a/plugins/stackstorm/src/components/PacksTable/PacksTable.tsx b/plugins/stackstorm/src/components/PacksTable/PacksTable.tsx
new file mode 100644
index 0000000000..2167200e8e
--- /dev/null
+++ b/plugins/stackstorm/src/components/PacksTable/PacksTable.tsx
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import {
+ Progress,
+ ResponseErrorPanel,
+ Table,
+ TableColumn,
+} from '@backstage/core-components';
+import useAsync from 'react-use/lib/useAsync';
+import { useApi } from '@backstage/core-plugin-api';
+import { Pack, stackstormApiRef } from '../../api';
+
+type DenseTableProps = {
+ packs: Pack[];
+};
+
+export const DenseTable = ({ packs }: DenseTableProps) => {
+ const columns: TableColumn[] = [
+ { title: 'Name', field: 'ref' },
+ { title: 'Description', field: 'description' },
+ { title: 'Version', field: 'version' },
+ ];
+
+ return (
+
+ );
+};
+
+export const PacksTable = () => {
+ const st2 = useApi(stackstormApiRef);
+
+ const { value, loading, error } = useAsync(async (): Promise => {
+ const data = await st2.getPacks();
+ return data;
+ }, []);
+
+ if (loading) {
+ return ;
+ } else if (error) {
+ return ;
+ }
+
+ return ;
+};
diff --git a/plugins/stackstorm/src/components/PacksTable/index.ts b/plugins/stackstorm/src/components/PacksTable/index.ts
new file mode 100644
index 0000000000..378e32a5d5
--- /dev/null
+++ b/plugins/stackstorm/src/components/PacksTable/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { PacksTable } from './PacksTable';
diff --git a/plugins/stackstorm/src/components/StackstormHome/StackstormHome.test.tsx b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.test.tsx
new file mode 100644
index 0000000000..897cec61c1
--- /dev/null
+++ b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.test.tsx
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import { StackstormHome } from './StackstormHome';
+import { screen } from '@testing-library/react';
+import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
+import { StackstormApi, stackstormApiRef } from '../../api';
+
+describe('StackstormHome', () => {
+ const mockApi: jest.Mocked = {
+ getExecutions: jest.fn().mockResolvedValue([]),
+ getExecution: jest.fn().mockResolvedValue({}),
+ getPacks: jest.fn().mockResolvedValue([]),
+ getActions: jest.fn().mockResolvedValue([]),
+ } as any;
+
+ it('should render', async () => {
+ await renderInTestApp(
+
+
+ ,
+ );
+ expect(screen.getByText('Welcome to StackStorm!')).toBeInTheDocument();
+ });
+});
diff --git a/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx
new file mode 100644
index 0000000000..d96d45e82d
--- /dev/null
+++ b/plugins/stackstorm/src/components/StackstormHome/StackstormHome.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+import { IconButton } from '@material-ui/core';
+import {
+ Header,
+ Page,
+ HeaderLabel,
+ TabbedLayout,
+ Content,
+} from '@backstage/core-components';
+import LibraryBooks from '@material-ui/icons/LibraryBooks';
+import { ExecutionsTable } from '../ExecutionsTable';
+import { PacksTable } from '../PacksTable/PacksTable';
+import { ActionsList } from '../ActionsList';
+
+export const StackstormHome = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/plugins/stackstorm/src/components/StackstormHome/index.ts b/plugins/stackstorm/src/components/StackstormHome/index.ts
new file mode 100644
index 0000000000..2063d21f34
--- /dev/null
+++ b/plugins/stackstorm/src/components/StackstormHome/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { StackstormHome } from './StackstormHome';
diff --git a/plugins/stackstorm/src/index.ts b/plugins/stackstorm/src/index.ts
new file mode 100644
index 0000000000..b64ae207e4
--- /dev/null
+++ b/plugins/stackstorm/src/index.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * A Backstage plugin that integrates towards StackStorm
+ *
+ * @packageDocumentation
+ */
+
+export { stackstormPlugin, StackstormPage } from './plugin';
diff --git a/plugins/stackstorm/src/plugin.test.ts b/plugins/stackstorm/src/plugin.test.ts
new file mode 100644
index 0000000000..9ef2f438c1
--- /dev/null
+++ b/plugins/stackstorm/src/plugin.test.ts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { stackstormPlugin } from './plugin';
+
+describe('stackstorm', () => {
+ it('should export plugin', () => {
+ expect(stackstormPlugin).toBeDefined();
+ });
+});
diff --git a/plugins/stackstorm/src/plugin.ts b/plugins/stackstorm/src/plugin.ts
new file mode 100644
index 0000000000..be4b9c065c
--- /dev/null
+++ b/plugins/stackstorm/src/plugin.ts
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+ configApiRef,
+ createApiFactory,
+ createPlugin,
+ createRoutableExtension,
+ discoveryApiRef,
+ fetchApiRef,
+} from '@backstage/core-plugin-api';
+import { stackstormApiRef, StackstormClient } from './api';
+import { rootRouteRef } from './routes';
+
+/**
+ * The Backstage plugin that holds stackstorm specific components
+ *
+ * @public
+ */
+export const stackstormPlugin = createPlugin({
+ id: 'stackstorm',
+ apis: [
+ createApiFactory({
+ api: stackstormApiRef,
+ deps: {
+ configApi: configApiRef,
+ discoveryApi: discoveryApiRef,
+ fetchApi: fetchApiRef,
+ },
+ factory: ({ configApi, discoveryApi, fetchApi }) =>
+ StackstormClient.fromConfig(configApi, {
+ discoveryApi,
+ fetchApi,
+ }),
+ }),
+ ],
+ routes: {
+ root: rootRouteRef,
+ },
+});
+
+/**
+ * A component to display a stackstorm home page
+ *
+ * @public
+ */
+export const StackstormPage = stackstormPlugin.provide(
+ createRoutableExtension({
+ name: 'StackstormPage',
+ component: () =>
+ import('./components/StackstormHome').then(m => m.StackstormHome),
+ mountPoint: rootRouteRef,
+ }),
+);
diff --git a/plugins/stackstorm/src/routes.ts b/plugins/stackstorm/src/routes.ts
new file mode 100644
index 0000000000..90cf7760bc
--- /dev/null
+++ b/plugins/stackstorm/src/routes.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { createRouteRef } from '@backstage/core-plugin-api';
+
+export const rootRouteRef = createRouteRef({
+ id: 'stackstorm',
+});
diff --git a/plugins/stackstorm/src/setupTests.ts b/plugins/stackstorm/src/setupTests.ts
new file mode 100644
index 0000000000..73dd8dce47
--- /dev/null
+++ b/plugins/stackstorm/src/setupTests.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import '@testing-library/jest-dom';
+import 'cross-fetch/polyfill';
diff --git a/yarn.lock b/yarn.lock
index 7d905a0873..0b2b2f350e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8008,6 +8008,33 @@ __metadata:
languageName: unknown
linkType: soft
+"@backstage/plugin-stackstorm@workspace:^, @backstage/plugin-stackstorm@workspace:plugins/stackstorm":
+ version: 0.0.0-use.local
+ resolution: "@backstage/plugin-stackstorm@workspace:plugins/stackstorm"
+ dependencies:
+ "@backstage/cli": "workspace:^"
+ "@backstage/core-app-api": "workspace:^"
+ "@backstage/core-components": "workspace:^"
+ "@backstage/core-plugin-api": "workspace:^"
+ "@backstage/dev-utils": "workspace:^"
+ "@backstage/errors": "workspace:^"
+ "@backstage/test-utils": "workspace:^"
+ "@backstage/theme": "workspace:^"
+ "@material-ui/core": ^4.12.2
+ "@material-ui/icons": ^4.9.1
+ "@material-ui/lab": ^4.0.0-alpha.57
+ "@testing-library/jest-dom": ^5.10.1
+ "@testing-library/react": ^12.1.3
+ "@testing-library/user-event": ^14.0.0
+ "@types/node": "*"
+ cross-fetch: ^3.1.5
+ msw: ^0.49.0
+ react-use: ^17.2.4
+ peerDependencies:
+ react: ^16.13.1 || ^17.0.0
+ languageName: unknown
+ linkType: soft
+
"@backstage/plugin-tech-insights-backend-module-jsonfc@workspace:^, @backstage/plugin-tech-insights-backend-module-jsonfc@workspace:plugins/tech-insights-backend-module-jsonfc":
version: 0.0.0-use.local
resolution: "@backstage/plugin-tech-insights-backend-module-jsonfc@workspace:plugins/tech-insights-backend-module-jsonfc"
@@ -22407,6 +22434,7 @@ __metadata:
"@backstage/plugin-sentry": "workspace:^"
"@backstage/plugin-shortcuts": "workspace:^"
"@backstage/plugin-stack-overflow": "workspace:^"
+ "@backstage/plugin-stackstorm": "workspace:^"
"@backstage/plugin-tech-insights": "workspace:^"
"@backstage/plugin-tech-radar": "workspace:^"
"@backstage/plugin-techdocs": "workspace:^"