@backstage/plugin-techdocs-addons-test-utils 1.0.9-next.1 → 1.0.9-next.2

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,21 @@
1
1
  # @backstage/plugin-techdocs-addons-test-utils
2
2
 
3
+ ## 1.0.9-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/plugin-search-react@1.4.0-next.2
9
+ - @backstage/core-plugin-api@1.3.0-next.1
10
+ - @backstage/core-app-api@1.4.0-next.1
11
+ - @backstage/plugin-techdocs-react@1.1.2-next.2
12
+ - @backstage/core-components@0.12.3-next.2
13
+ - @backstage/integration-react@1.1.9-next.2
14
+ - @backstage/test-utils@1.2.4-next.1
15
+ - @backstage/theme@0.2.16
16
+ - @backstage/plugin-catalog@1.7.2-next.2
17
+ - @backstage/plugin-techdocs@1.4.3-next.2
18
+
3
19
  ## 1.0.9-next.1
4
20
 
5
21
  ### Patch Changes
package/dist/index.esm.js CHANGED
@@ -45,34 +45,59 @@ const defaultEntity = {
45
45
  };
46
46
  const defaultDom = /* @__PURE__ */ React.createElement("html", { lang: "en" }, /* @__PURE__ */ React.createElement("head", null), /* @__PURE__ */ React.createElement("body", null, /* @__PURE__ */ React.createElement("div", { "data-md-component": "container" }, /* @__PURE__ */ React.createElement("div", { "data-md-component": "navigation" }), /* @__PURE__ */ React.createElement("div", { "data-md-component": "toc" }), /* @__PURE__ */ React.createElement("div", { "data-md-component": "main" }))));
47
47
  class TechDocsAddonTester {
48
+ // Protected in order to allow extension but not direct instantiation.
48
49
  constructor(addons) {
49
50
  this.options = defaultOptions;
50
51
  this.addons = addons;
51
52
  }
53
+ /**
54
+ * Get a TechDocsAddonTester instance for a given set of Addons.
55
+ */
52
56
  static buildAddonsInTechDocs(addons) {
53
57
  return new TechDocsAddonTester(addons);
54
58
  }
59
+ /**
60
+ * Provide mock API implementations if your Addon expects any.
61
+ */
55
62
  withApis(apis) {
56
63
  const refs = apis.map(([ref]) => ref);
57
64
  this.options.apis = this.options.apis.filter(([ref]) => !refs.includes(ref)).concat(apis);
58
65
  return this;
59
66
  }
67
+ /**
68
+ * Provide mock HTML if your Addon expects it in the shadow DOM.
69
+ */
60
70
  withDom(dom) {
61
71
  this.options.dom = dom;
62
72
  return this;
63
73
  }
74
+ /**
75
+ * Provide mock techdocs_metadata.json values if your Addon needs it.
76
+ */
64
77
  withMetadata(metadata) {
65
78
  this.options.metadata = metadata;
66
79
  return this;
67
80
  }
81
+ /**
82
+ * Provide a mock entity if your Addon needs it. This also controls the base
83
+ * path at which the Addon is rendered.
84
+ */
68
85
  withEntity(entity) {
69
86
  this.options.entity = entity;
70
87
  return this;
71
88
  }
89
+ /**
90
+ * Provide the TechDocs page path at which the Addon is rendered (e.g. the
91
+ * part of the path after the entity namespace/kind/name).
92
+ */
72
93
  atPath(path) {
73
94
  this.options.path = path;
74
95
  return this;
75
96
  }
97
+ /**
98
+ * Return a fully configured and mocked TechDocs reader page within a test
99
+ * App instance, using the given Addon(s).
100
+ */
76
101
  build() {
77
102
  var _a, _b, _c, _d, _e;
78
103
  const apis = [
@@ -124,6 +149,19 @@ class TechDocsAddonTester {
124
149
  }
125
150
  });
126
151
  }
152
+ /**
153
+ * Render the Addon within a fully configured and mocked TechDocs reader.
154
+ *
155
+ * @remarks
156
+ * Components using useEffect to perform an asynchronous action (such as
157
+ * fetch) must be rendered within an async act call to properly get the final
158
+ * state, even with mocked responses. This utility method makes the signature
159
+ * a bit cleaner, since act doesn't return the result of the evaluated
160
+ * function.
161
+ *
162
+ * @see https://github.com/testing-library/react-testing-library/issues/281
163
+ * @see https://github.com/facebook/react/pull/14853
164
+ */
127
165
  async renderWithEffects() {
128
166
  await act(async () => {
129
167
  render(this.build());
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/test-utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 React, { ReactElement, Fragment } from 'react';\n\n// Shadow DOM support for the simple and complete DOM testing utilities\n// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855\nimport { screen } from 'testing-library__dom';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { Route } from 'react-router-dom';\nimport { act, render } from '@testing-library/react';\n\nimport { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';\nimport { FlatRoutes } from '@backstage/core-app-api';\nimport { ApiRef } from '@backstage/core-plugin-api';\n\nimport {\n TechDocsAddons,\n techdocsApiRef,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderPage, techdocsPlugin } from '@backstage/plugin-techdocs';\nimport { catalogPlugin } from '@backstage/plugin-catalog';\nimport { searchApiRef } from '@backstage/plugin-search-react';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\n\nconst techdocsApi = {\n getTechDocsMetadata: jest.fn(),\n getEntityMetadata: jest.fn(),\n};\n\nconst techdocsStorageApi = {\n getApiOrigin: jest.fn(),\n getBaseUrl: jest.fn(),\n getEntityDocs: jest.fn(),\n syncEntityDocs: jest.fn(),\n};\n\nconst searchApi = {\n query: jest.fn().mockResolvedValue({ results: [] }),\n};\n\nconst scmIntegrationsApi = {\n fromConfig: jest.fn().mockReturnValue({}),\n};\n\n/** @ignore */\ntype TechDocsAddonTesterTestApiPair<TApi> = TApi extends infer TImpl\n ? readonly [ApiRef<TApi>, Partial<TImpl>]\n : never;\n\n/** @ignore */\ntype TechdocsAddonTesterApis<TApiPairs> = {\n [TIndex in keyof TApiPairs]: TechDocsAddonTesterTestApiPair<\n TApiPairs[TIndex]\n >;\n};\n\ntype TechDocsAddonTesterOptions = {\n dom: ReactElement;\n entity: Partial<TechDocsEntityMetadata>;\n metadata: Partial<TechDocsMetadata>;\n componentId: string;\n apis: TechdocsAddonTesterApis<any[]>;\n path: string;\n};\n\nconst defaultOptions: TechDocsAddonTesterOptions = {\n dom: <></>,\n entity: { metadata: { name: '' } },\n metadata: {},\n componentId: 'docs',\n apis: [],\n path: '',\n};\n\nconst defaultMetadata = {\n site_name: 'Tech Docs',\n site_description: 'Tech Docs',\n};\n\nconst defaultEntity = {\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n};\n\nconst defaultDom = (\n <html lang=\"en\">\n <head />\n <body>\n <div data-md-component=\"container\">\n <div data-md-component=\"navigation\" />\n <div data-md-component=\"toc\" />\n <div data-md-component=\"main\" />\n </div>\n </body>\n </html>\n);\n\n/**\n * Utility class for rendering TechDocs Addons end-to-end within the TechDocs\n * reader page, with a set of givens (e.g. page DOM, metadata, etc).\n *\n * @example\n * ```tsx\n * const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])\n * .withDom(<body>TEST_CONTENT</body>)\n * .renderWithEffects();\n *\n * expect(getByText('TEST_CONTENT')).toBeInTheDocument();\n * ```\n *\n * @public\n */\nexport class TechDocsAddonTester {\n private options: TechDocsAddonTesterOptions = defaultOptions;\n private addons: ReactElement[];\n\n /**\n * Get a TechDocsAddonTester instance for a given set of Addons.\n */\n static buildAddonsInTechDocs(addons: ReactElement[]) {\n return new TechDocsAddonTester(addons);\n }\n\n // Protected in order to allow extension but not direct instantiation.\n protected constructor(addons: ReactElement[]) {\n this.addons = addons;\n }\n\n /**\n * Provide mock API implementations if your Addon expects any.\n */\n withApis<T extends any[]>(apis: TechdocsAddonTesterApis<T>) {\n const refs = apis.map(([ref]) => ref);\n this.options.apis = this.options.apis\n .filter(([ref]) => !refs.includes(ref))\n .concat(apis);\n return this;\n }\n\n /**\n * Provide mock HTML if your Addon expects it in the shadow DOM.\n */\n withDom(dom: ReactElement) {\n this.options.dom = dom;\n return this;\n }\n\n /**\n * Provide mock techdocs_metadata.json values if your Addon needs it.\n */\n withMetadata(metadata: Partial<TechDocsMetadata>) {\n this.options.metadata = metadata;\n return this;\n }\n\n /**\n * Provide a mock entity if your Addon needs it. This also controls the base\n * path at which the Addon is rendered.\n */\n withEntity(entity: Partial<TechDocsEntityMetadata>) {\n this.options.entity = entity;\n return this;\n }\n\n /**\n * Provide the TechDocs page path at which the Addon is rendered (e.g. the\n * part of the path after the entity namespace/kind/name).\n */\n atPath(path: string) {\n this.options.path = path;\n return this;\n }\n\n /**\n * Return a fully configured and mocked TechDocs reader page within a test\n * App instance, using the given Addon(s).\n */\n build() {\n const apis: TechdocsAddonTesterApis<any[]> = [\n [techdocsApiRef, techdocsApi],\n [techdocsStorageApiRef, techdocsStorageApi],\n [searchApiRef, searchApi],\n [scmIntegrationsApiRef, scmIntegrationsApi],\n ...this.options.apis,\n ];\n\n const entityName = {\n namespace:\n this.options.entity?.metadata?.namespace ||\n defaultEntity.metadata.namespace,\n kind: this.options.entity?.kind || defaultEntity.kind,\n name: this.options.entity?.metadata?.name || defaultEntity.metadata.name,\n };\n\n techdocsApi.getTechDocsMetadata.mockReturnValue(\n this.options.metadata || { ...defaultMetadata },\n );\n techdocsApi.getEntityMetadata.mockResolvedValue(\n this.options.entity || { ...defaultEntity },\n );\n\n techdocsStorageApi.syncEntityDocs.mockResolvedValue('cached');\n techdocsStorageApi.getApiOrigin.mockResolvedValue(\n 'https://backstage.example.com/api/techdocs',\n );\n techdocsStorageApi.getBaseUrl.mockResolvedValue(\n `https://backstage.example.com/api/techdocs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n );\n techdocsStorageApi.getEntityDocs.mockResolvedValue(\n renderToStaticMarkup(this.options.dom || defaultDom),\n );\n\n const TechDocsAddonsPage = () => {\n return (\n <TestApiProvider apis={apis}>\n <FlatRoutes>\n <Route\n path=\"/docs/:namespace/:kind/:name/*\"\n element={<TechDocsReaderPage />}\n >\n <TechDocsAddons>\n {this.addons.map((addon, index) => (\n <Fragment key={index}>{addon}</Fragment>\n ))}\n </TechDocsAddons>\n </Route>\n </FlatRoutes>\n </TestApiProvider>\n );\n };\n\n return wrapInTestApp(<TechDocsAddonsPage />, {\n routeEntries: [\n `/docs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n ],\n mountedRoutes: {\n '/docs': techdocsPlugin.routes.root,\n '/docs/:namespace/:kind/:name/*': techdocsPlugin.routes.docRoot,\n '/catalog/:namespace/:kind/:name': catalogPlugin.routes.catalogEntity,\n },\n });\n }\n\n /**\n * Render the Addon within a fully configured and mocked TechDocs reader.\n *\n * @remarks\n * Components using useEffect to perform an asynchronous action (such as\n * fetch) must be rendered within an async act call to properly get the final\n * state, even with mocked responses. This utility method makes the signature\n * a bit cleaner, since act doesn't return the result of the evaluated\n * function.\n *\n * @see https://github.com/testing-library/react-testing-library/issues/281\n * @see https://github.com/facebook/react/pull/14853\n */\n async renderWithEffects(): Promise<\n typeof screen & { shadowRoot: ShadowRoot | null }\n > {\n await act(async () => {\n render(this.build());\n });\n\n const shadowHost = screen.getByTestId('techdocs-native-shadowroot');\n\n return {\n ...screen,\n shadowRoot: shadowHost?.shadowRoot || null,\n };\n }\n}\n\nexport default TechDocsAddonTester.buildAddonsInTechDocs;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/test-utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 React, { ReactElement, Fragment } from 'react';\n\n// Shadow DOM support for the simple and complete DOM testing utilities\n// https://github.com/testing-library/dom-testing-library/issues/742#issuecomment-674987855\nimport { screen } from 'testing-library__dom';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { Route } from 'react-router-dom';\nimport { act, render } from '@testing-library/react';\n\nimport { wrapInTestApp, TestApiProvider } from '@backstage/test-utils';\nimport { FlatRoutes } from '@backstage/core-app-api';\nimport { ApiRef } from '@backstage/core-plugin-api';\n\nimport {\n TechDocsAddons,\n techdocsApiRef,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderPage, techdocsPlugin } from '@backstage/plugin-techdocs';\nimport { catalogPlugin } from '@backstage/plugin-catalog';\nimport { searchApiRef } from '@backstage/plugin-search-react';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\n\nconst techdocsApi = {\n getTechDocsMetadata: jest.fn(),\n getEntityMetadata: jest.fn(),\n};\n\nconst techdocsStorageApi = {\n getApiOrigin: jest.fn(),\n getBaseUrl: jest.fn(),\n getEntityDocs: jest.fn(),\n syncEntityDocs: jest.fn(),\n};\n\nconst searchApi = {\n query: jest.fn().mockResolvedValue({ results: [] }),\n};\n\nconst scmIntegrationsApi = {\n fromConfig: jest.fn().mockReturnValue({}),\n};\n\n/** @ignore */\ntype TechDocsAddonTesterTestApiPair<TApi> = TApi extends infer TImpl\n ? readonly [ApiRef<TApi>, Partial<TImpl>]\n : never;\n\n/** @ignore */\ntype TechdocsAddonTesterApis<TApiPairs> = {\n [TIndex in keyof TApiPairs]: TechDocsAddonTesterTestApiPair<\n TApiPairs[TIndex]\n >;\n};\n\ntype TechDocsAddonTesterOptions = {\n dom: ReactElement;\n entity: Partial<TechDocsEntityMetadata>;\n metadata: Partial<TechDocsMetadata>;\n componentId: string;\n apis: TechdocsAddonTesterApis<any[]>;\n path: string;\n};\n\nconst defaultOptions: TechDocsAddonTesterOptions = {\n dom: <></>,\n entity: { metadata: { name: '' } },\n metadata: {},\n componentId: 'docs',\n apis: [],\n path: '',\n};\n\nconst defaultMetadata = {\n site_name: 'Tech Docs',\n site_description: 'Tech Docs',\n};\n\nconst defaultEntity = {\n kind: 'Component',\n metadata: { namespace: 'default', name: 'docs' },\n};\n\nconst defaultDom = (\n <html lang=\"en\">\n <head />\n <body>\n <div data-md-component=\"container\">\n <div data-md-component=\"navigation\" />\n <div data-md-component=\"toc\" />\n <div data-md-component=\"main\" />\n </div>\n </body>\n </html>\n);\n\n/**\n * Utility class for rendering TechDocs Addons end-to-end within the TechDocs\n * reader page, with a set of givens (e.g. page DOM, metadata, etc).\n *\n * @example\n * ```tsx\n * const { getByText } = await TechDocsAddonTester.buildAddonsInTechDocs([<AnAddon />])\n * .withDom(<body>TEST_CONTENT</body>)\n * .renderWithEffects();\n *\n * expect(getByText('TEST_CONTENT')).toBeInTheDocument();\n * ```\n *\n * @public\n */\nexport class TechDocsAddonTester {\n private options: TechDocsAddonTesterOptions = defaultOptions;\n private addons: ReactElement[];\n\n /**\n * Get a TechDocsAddonTester instance for a given set of Addons.\n */\n static buildAddonsInTechDocs(addons: ReactElement[]) {\n return new TechDocsAddonTester(addons);\n }\n\n // Protected in order to allow extension but not direct instantiation.\n protected constructor(addons: ReactElement[]) {\n this.addons = addons;\n }\n\n /**\n * Provide mock API implementations if your Addon expects any.\n */\n withApis<T extends any[]>(apis: TechdocsAddonTesterApis<T>) {\n const refs = apis.map(([ref]) => ref);\n this.options.apis = this.options.apis\n .filter(([ref]) => !refs.includes(ref))\n .concat(apis);\n return this;\n }\n\n /**\n * Provide mock HTML if your Addon expects it in the shadow DOM.\n */\n withDom(dom: ReactElement) {\n this.options.dom = dom;\n return this;\n }\n\n /**\n * Provide mock techdocs_metadata.json values if your Addon needs it.\n */\n withMetadata(metadata: Partial<TechDocsMetadata>) {\n this.options.metadata = metadata;\n return this;\n }\n\n /**\n * Provide a mock entity if your Addon needs it. This also controls the base\n * path at which the Addon is rendered.\n */\n withEntity(entity: Partial<TechDocsEntityMetadata>) {\n this.options.entity = entity;\n return this;\n }\n\n /**\n * Provide the TechDocs page path at which the Addon is rendered (e.g. the\n * part of the path after the entity namespace/kind/name).\n */\n atPath(path: string) {\n this.options.path = path;\n return this;\n }\n\n /**\n * Return a fully configured and mocked TechDocs reader page within a test\n * App instance, using the given Addon(s).\n */\n build() {\n const apis: TechdocsAddonTesterApis<any[]> = [\n [techdocsApiRef, techdocsApi],\n [techdocsStorageApiRef, techdocsStorageApi],\n [searchApiRef, searchApi],\n [scmIntegrationsApiRef, scmIntegrationsApi],\n ...this.options.apis,\n ];\n\n const entityName = {\n namespace:\n this.options.entity?.metadata?.namespace ||\n defaultEntity.metadata.namespace,\n kind: this.options.entity?.kind || defaultEntity.kind,\n name: this.options.entity?.metadata?.name || defaultEntity.metadata.name,\n };\n\n techdocsApi.getTechDocsMetadata.mockReturnValue(\n this.options.metadata || { ...defaultMetadata },\n );\n techdocsApi.getEntityMetadata.mockResolvedValue(\n this.options.entity || { ...defaultEntity },\n );\n\n techdocsStorageApi.syncEntityDocs.mockResolvedValue('cached');\n techdocsStorageApi.getApiOrigin.mockResolvedValue(\n 'https://backstage.example.com/api/techdocs',\n );\n techdocsStorageApi.getBaseUrl.mockResolvedValue(\n `https://backstage.example.com/api/techdocs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n );\n techdocsStorageApi.getEntityDocs.mockResolvedValue(\n renderToStaticMarkup(this.options.dom || defaultDom),\n );\n\n const TechDocsAddonsPage = () => {\n return (\n <TestApiProvider apis={apis}>\n <FlatRoutes>\n <Route\n path=\"/docs/:namespace/:kind/:name/*\"\n element={<TechDocsReaderPage />}\n >\n <TechDocsAddons>\n {this.addons.map((addon, index) => (\n <Fragment key={index}>{addon}</Fragment>\n ))}\n </TechDocsAddons>\n </Route>\n </FlatRoutes>\n </TestApiProvider>\n );\n };\n\n return wrapInTestApp(<TechDocsAddonsPage />, {\n routeEntries: [\n `/docs/${entityName.namespace}/${entityName.kind}/${entityName.name}/${this.options.path}`,\n ],\n mountedRoutes: {\n '/docs': techdocsPlugin.routes.root,\n '/docs/:namespace/:kind/:name/*': techdocsPlugin.routes.docRoot,\n '/catalog/:namespace/:kind/:name': catalogPlugin.routes.catalogEntity,\n },\n });\n }\n\n /**\n * Render the Addon within a fully configured and mocked TechDocs reader.\n *\n * @remarks\n * Components using useEffect to perform an asynchronous action (such as\n * fetch) must be rendered within an async act call to properly get the final\n * state, even with mocked responses. This utility method makes the signature\n * a bit cleaner, since act doesn't return the result of the evaluated\n * function.\n *\n * @see https://github.com/testing-library/react-testing-library/issues/281\n * @see https://github.com/facebook/react/pull/14853\n */\n async renderWithEffects(): Promise<\n typeof screen & { shadowRoot: ShadowRoot | null }\n > {\n await act(async () => {\n render(this.build());\n });\n\n const shadowHost = screen.getByTestId('techdocs-native-shadowroot');\n\n return {\n ...screen,\n shadowRoot: shadowHost?.shadowRoot || null,\n };\n }\n}\n\nexport default TechDocsAddonTester.buildAddonsInTechDocs;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs-addons-test-utils",
3
- "version": "1.0.9-next.1",
3
+ "version": "1.0.9-next.2",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -32,15 +32,15 @@
32
32
  "postpack": "backstage-cli package postpack"
33
33
  },
34
34
  "dependencies": {
35
- "@backstage/core-app-api": "^1.3.1-next.0",
36
- "@backstage/core-components": "^0.12.3-next.1",
37
- "@backstage/core-plugin-api": "^1.2.1-next.0",
38
- "@backstage/integration-react": "^1.1.9-next.1",
39
- "@backstage/plugin-catalog": "^1.7.2-next.1",
40
- "@backstage/plugin-search-react": "^1.3.2-next.1",
41
- "@backstage/plugin-techdocs": "^1.4.3-next.1",
42
- "@backstage/plugin-techdocs-react": "^1.1.2-next.1",
43
- "@backstage/test-utils": "^1.2.4-next.0",
35
+ "@backstage/core-app-api": "^1.4.0-next.1",
36
+ "@backstage/core-components": "^0.12.3-next.2",
37
+ "@backstage/core-plugin-api": "^1.3.0-next.1",
38
+ "@backstage/integration-react": "^1.1.9-next.2",
39
+ "@backstage/plugin-catalog": "^1.7.2-next.2",
40
+ "@backstage/plugin-search-react": "^1.4.0-next.2",
41
+ "@backstage/plugin-techdocs": "^1.4.3-next.2",
42
+ "@backstage/plugin-techdocs-react": "^1.1.2-next.2",
43
+ "@backstage/test-utils": "^1.2.4-next.1",
44
44
  "@backstage/theme": "^0.2.16",
45
45
  "@material-ui/core": "^4.9.13",
46
46
  "@material-ui/icons": "^4.9.1",
@@ -56,8 +56,8 @@
56
56
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@backstage/cli": "^0.22.1-next.1",
60
- "@backstage/dev-utils": "^1.0.11-next.1",
59
+ "@backstage/cli": "^0.22.1-next.2",
60
+ "@backstage/dev-utils": "^1.0.11-next.2",
61
61
  "@testing-library/jest-dom": "^5.10.1",
62
62
  "@testing-library/react": "^12.1.3",
63
63
  "@testing-library/user-event": "^14.0.0",