@backstage/core-compat-api 0.5.10-next.0 → 0.5.10-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 +12 -0
- package/dist/collectLegacyRoutes.esm.js +1 -0
- package/dist/collectLegacyRoutes.esm.js.map +1 -1
- package/dist/convertLegacyPageExtension.esm.js +1 -0
- package/dist/convertLegacyPageExtension.esm.js.map +1 -1
- package/dist/convertLegacyRouteRef.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage/core-compat-api
|
|
2
2
|
|
|
3
|
+
## 0.5.10-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 77ab7d5: Hide the default page header for pages created through the compatibility wrappers, since legacy plugins already render their own headers.
|
|
8
|
+
- 49397c1: Removed unnecessary type argument from internal `createRouteRef` call.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
- @backstage/plugin-catalog-react@2.1.2-next.1
|
|
11
|
+
- @backstage/frontend-plugin-api@0.16.0-next.1
|
|
12
|
+
- @backstage/core-plugin-api@1.12.5-next.1
|
|
13
|
+
- @backstage/plugin-app-react@0.2.2-next.1
|
|
14
|
+
|
|
3
15
|
## 0.5.10-next.0
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -127,6 +127,7 @@ function collectLegacyRoutes(flatRoutesElement, entityPage) {
|
|
|
127
127
|
factory(originalFactory, { inputs: _inputs }) {
|
|
128
128
|
return originalFactory({
|
|
129
129
|
path: normalizeRoutePath(path),
|
|
130
|
+
noHeader: true,
|
|
130
131
|
routeRef: routeRef ? convertLegacyRouteRef(routeRef) : void 0,
|
|
131
132
|
loader: async () => compatWrapper(
|
|
132
133
|
route.props.children ? /* @__PURE__ */ jsx(Routes, { children: /* @__PURE__ */ jsx(Route, { path: "*", element: routeElement, children: /* @__PURE__ */ jsx(Route, { path: "*", element: route.props.children }) }) }) : routeElement
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectLegacyRoutes.esm.js","sources":["../src/collectLegacyRoutes.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 {\n AnyRouteRefParams,\n BackstagePlugin as LegacyBackstagePlugin,\n RouteRef,\n createPlugin,\n getComponentData,\n} from '@backstage/core-plugin-api';\nimport {\n FrontendPlugin,\n ExtensionDefinition,\n coreExtensionData,\n createExtension,\n createExtensionInput,\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n FrontendModule,\n createFrontendModule,\n} from '@backstage/frontend-plugin-api';\nimport { Children, ReactNode, isValidElement } from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport {\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from './convertLegacyRouteRef';\nimport { compatWrapper } from './compatWrapper';\nimport { collectEntityPageContents } from './collectEntityPageContents';\nimport { normalizeRoutePath } from './normalizeRoutePath';\n\n/*\n\n# Legacy interoperability\n\nUse-cases (prioritized):\n 1. Slowly migrate over an existing app to DI, piece by piece\n 2. Use a legacy plugin in a new DI app\n 3. Use DI in an existing legacy app\n\nStarting point: use-case #1\n\nPotential solutions:\n 1. Codemods (we're not considering this for now)\n 2. Legacy apps are migrated bottom-up, i.e. keep legacy root, replace pages with DI\n 3. Legacy apps are migrated top-down i.e. switch out base to DI, legacy adapter allows for usage of existing app structure\n\nChosen path: #3\n\nExisting tasks:\n - Adopters can migrate their existing app gradually (~4)\n - Example-app uses legacy base with DI adapters\n - Create an API that lets you inject DI into existing apps - working assumption is that this is enough\n - Adopters can use legacy plugins in DI through adapters (~8)\n - App-next uses DI base with legacy adapters\n - Create a legacy adapter that is able to take an existing extension tree\n\n*/\n\n// Creates a shim extension whose purpose is to build up the tree (anchored at\n// the root page) of paths/routeRefs so that the app can bind them properly.\nfunction makeRoutingShimExtension(options: {\n name: string;\n parentExtensionId: string;\n routePath?: string;\n routeRef?: RouteRef;\n}) {\n const { name, parentExtensionId, routePath, routeRef } = options;\n return createExtension({\n kind: 'routing-shim',\n name,\n attachTo: { id: parentExtensionId, input: 'childRoutingShims' },\n inputs: {\n childRoutingShims: createExtensionInput([\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ]),\n },\n output: [\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ],\n *factory() {\n if (routePath !== undefined) {\n yield coreExtensionData.routePath(routePath);\n }\n\n if (routeRef) {\n yield coreExtensionData.routeRef(convertLegacyRouteRef(routeRef));\n }\n },\n });\n}\n\nexport function visitRouteChildren(options: {\n children: ReactNode;\n parentExtensionId: string;\n context: {\n pluginId: string;\n extensions: ExtensionDefinition[];\n getUniqueName: () => string;\n discoverPlugin: (plugin: LegacyBackstagePlugin) => void;\n };\n}): void {\n const { children, parentExtensionId, context } = options;\n const { pluginId, extensions, getUniqueName, discoverPlugin } = context;\n\n Children.forEach(children, node => {\n if (!isValidElement(node)) {\n return;\n }\n\n const plugin = getComponentData<LegacyBackstagePlugin>(node, 'core.plugin');\n const routeRef = getComponentData<RouteRef<AnyRouteRefParams>>(\n node,\n 'core.mountPoint',\n );\n const routePath: string | undefined = node.props?.path;\n\n if (plugin) {\n // We just mark the plugin as discovered, but don't change the context\n discoverPlugin(plugin);\n }\n\n let nextParentExtensionId = parentExtensionId;\n if (routeRef || routePath) {\n const nextParentExtensionName = getUniqueName();\n nextParentExtensionId = `routing-shim:${pluginId}/${nextParentExtensionName}`;\n extensions.push(\n makeRoutingShimExtension({\n name: nextParentExtensionName,\n parentExtensionId,\n routePath,\n routeRef,\n }),\n );\n }\n\n visitRouteChildren({\n children: node.props.children,\n parentExtensionId: nextParentExtensionId,\n context,\n });\n });\n}\n\n/** @internal */\nexport function collectLegacyRoutes(\n flatRoutesElement: JSX.Element,\n entityPage?: JSX.Element,\n): (FrontendPlugin | FrontendModule)[] {\n const output = new Array<FrontendPlugin | FrontendModule>();\n\n const pluginExtensions = new Map<\n LegacyBackstagePlugin,\n ExtensionDefinition[]\n >();\n\n const getUniqueName = (() => {\n let currentIndex = 1;\n return () => String(currentIndex++);\n })();\n\n // Placeholder plugin for any routes that don't belong to a plugin\n const orphanRoutesPlugin = createPlugin({ id: 'converted-orphan-routes' });\n\n const getPluginExtensions = (plugin: LegacyBackstagePlugin) => {\n let extensions = pluginExtensions.get(plugin);\n if (!extensions) {\n extensions = [];\n pluginExtensions.set(plugin, extensions);\n }\n return extensions;\n };\n\n Children.forEach(flatRoutesElement.props.children, (route: ReactNode) => {\n if (route === null) {\n return;\n }\n // TODO(freben): Handle feature flag and permissions framework wrapper elements\n if (!isValidElement(route)) {\n throw new Error(\n `Invalid element inside FlatRoutes, expected Route but found element of type ${typeof route}.`,\n );\n }\n if (route.type !== Route) {\n throw new Error(\n `Invalid element inside FlatRoutes, expected Route but found ${route.type}.`,\n );\n }\n const routeElement = route.props.element;\n const path: string | undefined = route.props.path;\n const plugin =\n getComponentData<LegacyBackstagePlugin>(routeElement, 'core.plugin') ??\n orphanRoutesPlugin;\n const routeRef = getComponentData<RouteRef>(\n routeElement,\n 'core.mountPoint',\n );\n if (path === undefined) {\n throw new Error(\n `Route element inside FlatRoutes had no path prop value given`,\n );\n }\n\n const extensions = getPluginExtensions(plugin);\n const pageExtensionName = extensions.length ? getUniqueName() : undefined;\n const pageExtensionId = `page:${plugin.getId()}${\n pageExtensionName ? `/${pageExtensionName}` : pageExtensionName\n }`;\n\n extensions.push(\n PageBlueprint.makeWithOverrides({\n name: pageExtensionName,\n inputs: {\n childRoutingShims: createExtensionInput([\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ]),\n },\n factory(originalFactory, { inputs: _inputs }) {\n // todo(blam): why do we not use the inputs here?\n return originalFactory({\n path: normalizeRoutePath(path),\n routeRef: routeRef ? convertLegacyRouteRef(routeRef) : undefined,\n loader: async () =>\n compatWrapper(\n route.props.children ? (\n <Routes>\n <Route path=\"*\" element={routeElement}>\n <Route path=\"*\" element={route.props.children} />\n </Route>\n </Routes>\n ) : (\n routeElement\n ),\n ),\n });\n },\n }),\n );\n\n visitRouteChildren({\n children: route.props.children,\n parentExtensionId: pageExtensionId,\n context: {\n pluginId: plugin.getId(),\n extensions,\n getUniqueName,\n discoverPlugin: getPluginExtensions,\n },\n });\n });\n\n if (entityPage) {\n collectEntityPageContents(entityPage, {\n discoverExtension(extension, plugin) {\n if (!plugin || plugin.getId() === 'catalog') {\n getPluginExtensions(orphanRoutesPlugin).push(extension);\n } else {\n getPluginExtensions(plugin).push(extension);\n }\n },\n });\n\n const extensions = new Array<ExtensionDefinition>();\n visitRouteChildren({\n children: entityPage,\n parentExtensionId: `page:catalog/entity`,\n context: {\n pluginId: 'catalog',\n extensions,\n getUniqueName,\n discoverPlugin(plugin) {\n if (plugin.getId() !== 'catalog') {\n getPluginExtensions(plugin);\n }\n },\n },\n });\n\n output.push(\n createFrontendModule({\n pluginId: 'catalog',\n extensions,\n }),\n );\n }\n\n for (const [plugin, extensions] of pluginExtensions) {\n output.push(\n createFrontendPlugin({\n pluginId: plugin.getId(),\n extensions: [\n ...extensions,\n ...Array.from(plugin.getApis()).map(factory =>\n ApiBlueprint.make({\n name: factory.api.id,\n params: defineParams => defineParams(factory),\n }),\n ),\n ],\n routes: convertLegacyRouteRefs(plugin.routes ?? {}),\n externalRoutes: convertLegacyRouteRefs(plugin.externalRoutes ?? {}),\n }),\n );\n }\n\n return output;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"collectLegacyRoutes.esm.js","sources":["../src/collectLegacyRoutes.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 {\n AnyRouteRefParams,\n BackstagePlugin as LegacyBackstagePlugin,\n RouteRef,\n createPlugin,\n getComponentData,\n} from '@backstage/core-plugin-api';\nimport {\n FrontendPlugin,\n ExtensionDefinition,\n coreExtensionData,\n createExtension,\n createExtensionInput,\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n FrontendModule,\n createFrontendModule,\n} from '@backstage/frontend-plugin-api';\nimport { Children, ReactNode, isValidElement } from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport {\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from './convertLegacyRouteRef';\nimport { compatWrapper } from './compatWrapper';\nimport { collectEntityPageContents } from './collectEntityPageContents';\nimport { normalizeRoutePath } from './normalizeRoutePath';\n\n/*\n\n# Legacy interoperability\n\nUse-cases (prioritized):\n 1. Slowly migrate over an existing app to DI, piece by piece\n 2. Use a legacy plugin in a new DI app\n 3. Use DI in an existing legacy app\n\nStarting point: use-case #1\n\nPotential solutions:\n 1. Codemods (we're not considering this for now)\n 2. Legacy apps are migrated bottom-up, i.e. keep legacy root, replace pages with DI\n 3. Legacy apps are migrated top-down i.e. switch out base to DI, legacy adapter allows for usage of existing app structure\n\nChosen path: #3\n\nExisting tasks:\n - Adopters can migrate their existing app gradually (~4)\n - Example-app uses legacy base with DI adapters\n - Create an API that lets you inject DI into existing apps - working assumption is that this is enough\n - Adopters can use legacy plugins in DI through adapters (~8)\n - App-next uses DI base with legacy adapters\n - Create a legacy adapter that is able to take an existing extension tree\n\n*/\n\n// Creates a shim extension whose purpose is to build up the tree (anchored at\n// the root page) of paths/routeRefs so that the app can bind them properly.\nfunction makeRoutingShimExtension(options: {\n name: string;\n parentExtensionId: string;\n routePath?: string;\n routeRef?: RouteRef;\n}) {\n const { name, parentExtensionId, routePath, routeRef } = options;\n return createExtension({\n kind: 'routing-shim',\n name,\n attachTo: { id: parentExtensionId, input: 'childRoutingShims' },\n inputs: {\n childRoutingShims: createExtensionInput([\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ]),\n },\n output: [\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ],\n *factory() {\n if (routePath !== undefined) {\n yield coreExtensionData.routePath(routePath);\n }\n\n if (routeRef) {\n yield coreExtensionData.routeRef(convertLegacyRouteRef(routeRef));\n }\n },\n });\n}\n\nexport function visitRouteChildren(options: {\n children: ReactNode;\n parentExtensionId: string;\n context: {\n pluginId: string;\n extensions: ExtensionDefinition[];\n getUniqueName: () => string;\n discoverPlugin: (plugin: LegacyBackstagePlugin) => void;\n };\n}): void {\n const { children, parentExtensionId, context } = options;\n const { pluginId, extensions, getUniqueName, discoverPlugin } = context;\n\n Children.forEach(children, node => {\n if (!isValidElement(node)) {\n return;\n }\n\n const plugin = getComponentData<LegacyBackstagePlugin>(node, 'core.plugin');\n const routeRef = getComponentData<RouteRef<AnyRouteRefParams>>(\n node,\n 'core.mountPoint',\n );\n const routePath: string | undefined = node.props?.path;\n\n if (plugin) {\n // We just mark the plugin as discovered, but don't change the context\n discoverPlugin(plugin);\n }\n\n let nextParentExtensionId = parentExtensionId;\n if (routeRef || routePath) {\n const nextParentExtensionName = getUniqueName();\n nextParentExtensionId = `routing-shim:${pluginId}/${nextParentExtensionName}`;\n extensions.push(\n makeRoutingShimExtension({\n name: nextParentExtensionName,\n parentExtensionId,\n routePath,\n routeRef,\n }),\n );\n }\n\n visitRouteChildren({\n children: node.props.children,\n parentExtensionId: nextParentExtensionId,\n context,\n });\n });\n}\n\n/** @internal */\nexport function collectLegacyRoutes(\n flatRoutesElement: JSX.Element,\n entityPage?: JSX.Element,\n): (FrontendPlugin | FrontendModule)[] {\n const output = new Array<FrontendPlugin | FrontendModule>();\n\n const pluginExtensions = new Map<\n LegacyBackstagePlugin,\n ExtensionDefinition[]\n >();\n\n const getUniqueName = (() => {\n let currentIndex = 1;\n return () => String(currentIndex++);\n })();\n\n // Placeholder plugin for any routes that don't belong to a plugin\n const orphanRoutesPlugin = createPlugin({ id: 'converted-orphan-routes' });\n\n const getPluginExtensions = (plugin: LegacyBackstagePlugin) => {\n let extensions = pluginExtensions.get(plugin);\n if (!extensions) {\n extensions = [];\n pluginExtensions.set(plugin, extensions);\n }\n return extensions;\n };\n\n Children.forEach(flatRoutesElement.props.children, (route: ReactNode) => {\n if (route === null) {\n return;\n }\n // TODO(freben): Handle feature flag and permissions framework wrapper elements\n if (!isValidElement(route)) {\n throw new Error(\n `Invalid element inside FlatRoutes, expected Route but found element of type ${typeof route}.`,\n );\n }\n if (route.type !== Route) {\n throw new Error(\n `Invalid element inside FlatRoutes, expected Route but found ${route.type}.`,\n );\n }\n const routeElement = route.props.element;\n const path: string | undefined = route.props.path;\n const plugin =\n getComponentData<LegacyBackstagePlugin>(routeElement, 'core.plugin') ??\n orphanRoutesPlugin;\n const routeRef = getComponentData<RouteRef>(\n routeElement,\n 'core.mountPoint',\n );\n if (path === undefined) {\n throw new Error(\n `Route element inside FlatRoutes had no path prop value given`,\n );\n }\n\n const extensions = getPluginExtensions(plugin);\n const pageExtensionName = extensions.length ? getUniqueName() : undefined;\n const pageExtensionId = `page:${plugin.getId()}${\n pageExtensionName ? `/${pageExtensionName}` : pageExtensionName\n }`;\n\n extensions.push(\n PageBlueprint.makeWithOverrides({\n name: pageExtensionName,\n inputs: {\n childRoutingShims: createExtensionInput([\n coreExtensionData.routePath.optional(),\n coreExtensionData.routeRef.optional(),\n ]),\n },\n factory(originalFactory, { inputs: _inputs }) {\n // todo(blam): why do we not use the inputs here?\n return originalFactory({\n path: normalizeRoutePath(path),\n noHeader: true,\n routeRef: routeRef ? convertLegacyRouteRef(routeRef) : undefined,\n loader: async () =>\n compatWrapper(\n route.props.children ? (\n <Routes>\n <Route path=\"*\" element={routeElement}>\n <Route path=\"*\" element={route.props.children} />\n </Route>\n </Routes>\n ) : (\n routeElement\n ),\n ),\n });\n },\n }),\n );\n\n visitRouteChildren({\n children: route.props.children,\n parentExtensionId: pageExtensionId,\n context: {\n pluginId: plugin.getId(),\n extensions,\n getUniqueName,\n discoverPlugin: getPluginExtensions,\n },\n });\n });\n\n if (entityPage) {\n collectEntityPageContents(entityPage, {\n discoverExtension(extension, plugin) {\n if (!plugin || plugin.getId() === 'catalog') {\n getPluginExtensions(orphanRoutesPlugin).push(extension);\n } else {\n getPluginExtensions(plugin).push(extension);\n }\n },\n });\n\n const extensions = new Array<ExtensionDefinition>();\n visitRouteChildren({\n children: entityPage,\n parentExtensionId: `page:catalog/entity`,\n context: {\n pluginId: 'catalog',\n extensions,\n getUniqueName,\n discoverPlugin(plugin) {\n if (plugin.getId() !== 'catalog') {\n getPluginExtensions(plugin);\n }\n },\n },\n });\n\n output.push(\n createFrontendModule({\n pluginId: 'catalog',\n extensions,\n }),\n );\n }\n\n for (const [plugin, extensions] of pluginExtensions) {\n output.push(\n createFrontendPlugin({\n pluginId: plugin.getId(),\n extensions: [\n ...extensions,\n ...Array.from(plugin.getApis()).map(factory =>\n ApiBlueprint.make({\n name: factory.api.id,\n params: defineParams => defineParams(factory),\n }),\n ),\n ],\n routes: convertLegacyRouteRefs(plugin.routes ?? {}),\n externalRoutes: convertLegacyRouteRefs(plugin.externalRoutes ?? {}),\n }),\n );\n }\n\n return output;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ function convertLegacyPageExtension(LegacyExtension, overrides) {
|
|
|
21
21
|
name: overrides?.name ?? kebabName,
|
|
22
22
|
params: {
|
|
23
23
|
path: overrides?.path ?? `/${kebabName}`,
|
|
24
|
+
noHeader: true,
|
|
24
25
|
routeRef: mountPoint && convertLegacyRouteRef(mountPoint),
|
|
25
26
|
loader: async () => compatWrapper(element)
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertLegacyPageExtension.esm.js","sources":["../src/convertLegacyPageExtension.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getComponentData,\n RouteRef as LegacyRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n ExtensionDefinition,\n PageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport kebabCase from 'lodash/kebabCase';\nimport { convertLegacyRouteRef } from './convertLegacyRouteRef';\nimport { ComponentType } from 'react';\nimport { compatWrapper } from './compatWrapper';\n\n/** @public */\nexport function convertLegacyPageExtension(\n LegacyExtension: ComponentType<{}>,\n overrides?: {\n name?: string;\n path?: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultPath?: [Error: `Use the 'path' override instead`];\n },\n): ExtensionDefinition {\n const element = <LegacyExtension />;\n\n const extName = getComponentData<string>(element, 'core.extensionName');\n if (!extName) {\n throw new Error('Extension has no name');\n }\n\n const mountPoint = getComponentData<LegacyRouteRef>(\n element,\n 'core.mountPoint',\n );\n\n const name = extName.endsWith('Page')\n ? extName.slice(0, -'Page'.length)\n : extName;\n const kebabName = kebabCase(name);\n\n return PageBlueprint.make({\n name: overrides?.name ?? kebabName,\n params: {\n path: overrides?.path ?? `/${kebabName}`,\n routeRef: mountPoint && convertLegacyRouteRef(mountPoint),\n loader: async () => compatWrapper(element),\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;AA8BO,SAAS,0BAAA,CACd,iBACA,SAAA,EAQqB;AACrB,EAAA,MAAM,OAAA,uBAAW,eAAA,EAAA,EAAgB,CAAA;AAEjC,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAyB,OAAA,EAAS,oBAAoB,CAAA;AACtE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,UAAA,GAAa,gBAAA;AAAA,IACjB,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAChC,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,MAAA,CAAO,MAAM,CAAA,GAC/B,OAAA;AACJ,EAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAEhC,EAAA,OAAO,cAAc,IAAA,CAAK;AAAA,IACxB,IAAA,EAAM,WAAW,IAAA,IAAQ,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACtC,QAAA,EAAU,UAAA,IAAc,qBAAA,CAAsB,UAAU,CAAA;AAAA,MACxD,MAAA,EAAQ,YAAY,aAAA,CAAc,OAAO;AAAA;AAC3C,GACD,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"convertLegacyPageExtension.esm.js","sources":["../src/convertLegacyPageExtension.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getComponentData,\n RouteRef as LegacyRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n ExtensionDefinition,\n PageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport kebabCase from 'lodash/kebabCase';\nimport { convertLegacyRouteRef } from './convertLegacyRouteRef';\nimport { ComponentType } from 'react';\nimport { compatWrapper } from './compatWrapper';\n\n/** @public */\nexport function convertLegacyPageExtension(\n LegacyExtension: ComponentType<{}>,\n overrides?: {\n name?: string;\n path?: string;\n /**\n * @deprecated Use the `path` param instead.\n */\n defaultPath?: [Error: `Use the 'path' override instead`];\n },\n): ExtensionDefinition {\n const element = <LegacyExtension />;\n\n const extName = getComponentData<string>(element, 'core.extensionName');\n if (!extName) {\n throw new Error('Extension has no name');\n }\n\n const mountPoint = getComponentData<LegacyRouteRef>(\n element,\n 'core.mountPoint',\n );\n\n const name = extName.endsWith('Page')\n ? extName.slice(0, -'Page'.length)\n : extName;\n const kebabName = kebabCase(name);\n\n return PageBlueprint.make({\n name: overrides?.name ?? kebabName,\n params: {\n path: overrides?.path ?? `/${kebabName}`,\n noHeader: true,\n routeRef: mountPoint && convertLegacyRouteRef(mountPoint),\n loader: async () => compatWrapper(element),\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;AA8BO,SAAS,0BAAA,CACd,iBACA,SAAA,EAQqB;AACrB,EAAA,MAAM,OAAA,uBAAW,eAAA,EAAA,EAAgB,CAAA;AAEjC,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAyB,OAAA,EAAS,oBAAoB,CAAA;AACtE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,UAAA,GAAa,gBAAA;AAAA,IACjB,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,GAChC,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,MAAA,CAAO,MAAM,CAAA,GAC/B,OAAA;AACJ,EAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAEhC,EAAA,OAAO,cAAc,IAAA,CAAK;AAAA,IACxB,IAAA,EAAM,WAAW,IAAA,IAAQ,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACtC,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU,UAAA,IAAc,qBAAA,CAAsB,UAAU,CAAA;AAAA,MACxD,MAAA,EAAQ,YAAY,aAAA,CAAc,OAAO;AAAA;AAC3C,GACD,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertLegacyRouteRef.esm.js","sources":["../src/convertLegacyRouteRef.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 */\n\nimport {\n RouteRef as LegacyRouteRef,\n SubRouteRef as LegacySubRouteRef,\n ExternalRouteRef as LegacyExternalRouteRef,\n AnyRouteRefParams,\n} from '@backstage/core-plugin-api';\n\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { routeRefType } from '../../core-plugin-api/src/routing/types';\n\nimport {\n RouteRef,\n SubRouteRef,\n ExternalRouteRef,\n createRouteRef,\n createSubRouteRef,\n createExternalRouteRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n OpaqueRouteRef,\n OpaqueSubRouteRef,\n OpaqueExternalRouteRef,\n} from '@internal/frontend';\n\n/**\n * Converts a legacy route ref type to the new system.\n *\n * @public\n */\nexport type ToNewRouteRef<\n T extends LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef,\n> = T extends LegacyRouteRef<infer IParams>\n ? RouteRef<IParams>\n : T extends LegacySubRouteRef<infer IParams>\n ? SubRouteRef<IParams>\n : T extends LegacyExternalRouteRef<infer IParams>\n ? ExternalRouteRef<IParams>\n : never;\n\n/**\n * Converts a collection of legacy route refs to the new system.\n * This is particularly useful when defining plugin `routes` and `externalRoutes`.\n *\n * @public\n */\nexport function convertLegacyRouteRefs<\n TRefs extends {\n [name in string]:\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef;\n },\n>(refs: TRefs): { [KName in keyof TRefs]: ToNewRouteRef<TRefs[KName]> } {\n return Object.fromEntries(\n Object.entries(refs).map(([name, ref]) => [\n name,\n convertLegacyRouteRef(ref as LegacyRouteRef),\n ]),\n ) as { [KName in keyof TRefs]: ToNewRouteRef<TRefs[KName]> };\n}\n\n/**\n * A temporary helper to convert a legacy route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacyRouteRef<TParams>,\n): RouteRef<TParams>;\n\n/**\n * A temporary helper to convert a legacy sub route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createSubRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacySubRouteRef<TParams>,\n): SubRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a legacy external route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createExternalRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacyExternalRouteRef<TParams>,\n): ExternalRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: RouteRef<TParams>,\n): LegacyRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new sub route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createSubRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: SubRouteRef<TParams>,\n): LegacySubRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new external route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createExternalRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: ExternalRouteRef<TParams>,\n): LegacyExternalRouteRef<TParams, true>;\nexport function convertLegacyRouteRef(\n ref:\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef\n | RouteRef\n | SubRouteRef\n | ExternalRouteRef,\n):\n | RouteRef\n | SubRouteRef\n | ExternalRouteRef\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef {\n const isNew = '$$type' in ref;\n const oldType = (ref as unknown as { [routeRefType]: unknown })[routeRefType];\n\n // Ref has already been converted\n if (isNew && oldType) {\n return ref as any;\n }\n\n if (isNew) {\n return convertNewToOld(\n ref as unknown as RouteRef | SubRouteRef | ExternalRouteRef,\n );\n }\n\n return convertOldToNew(ref, oldType);\n}\n\nfunction convertNewToOld(\n ref: RouteRef | SubRouteRef | ExternalRouteRef,\n): LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef {\n if (ref.$$type === '@backstage/RouteRef') {\n const newRef = OpaqueRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'absolute',\n params: newRef.getParams(),\n title: newRef.getDescription(),\n } as Omit<LegacyRouteRef, '$$routeRefType' | keyof RouteRef>) as unknown as LegacyRouteRef;\n }\n if (ref.$$type === '@backstage/SubRouteRef') {\n const newRef = OpaqueSubRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'sub',\n parent: convertLegacyRouteRef(newRef.getParent()),\n params: newRef.getParams(),\n } as Omit<LegacySubRouteRef, '$$routeRefType' | keyof SubRouteRef>) as unknown as LegacySubRouteRef;\n }\n if (ref.$$type === '@backstage/ExternalRouteRef') {\n const newRef = OpaqueExternalRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'external',\n optional: true,\n params: newRef.getParams(),\n defaultTarget: newRef.getDefaultTarget(),\n } as Omit<LegacyExternalRouteRef, '$$routeRefType' | keyof ExternalRouteRef>) as unknown as LegacyExternalRouteRef;\n }\n\n throw new Error(\n `Failed to convert route ref, unknown type '${(ref as any).$$type}'`,\n );\n}\n\nfunction convertOldToNew(\n ref: LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef,\n type: unknown,\n): RouteRef | SubRouteRef | ExternalRouteRef {\n if (type === 'absolute') {\n const legacyRef = ref as LegacyRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueRouteRef.toInternal(\n createRouteRef<{ [key in string]: string }>({\n params: legacyRef.params as string[],\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/RouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getDescription() {\n return legacyRefStr;\n },\n setId(id: string) {\n newRef.setId(id);\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n if (type === 'sub') {\n const legacyRef = ref as LegacySubRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueSubRouteRef.toInternal(\n createSubRouteRef({\n path: legacyRef.path,\n parent: convertLegacyRouteRef(legacyRef.parent),\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/SubRouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getParent() {\n return newRef.getParent();\n },\n getDescription() {\n return legacyRefStr;\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n if (type === 'external') {\n const legacyRef = ref as LegacyExternalRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueExternalRouteRef.toInternal(\n createExternalRouteRef<{ [key in string]: string }>({\n params: legacyRef.params as string[],\n defaultTarget:\n 'getDefaultTarget' in legacyRef\n ? (legacyRef.getDefaultTarget as () => string | undefined)()\n : undefined,\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/ExternalRouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getDescription() {\n return legacyRefStr;\n },\n // This might already be implemented in the legacy ref, but we override it just to be sure\n getDefaultTarget() {\n return newRef.getDefaultTarget();\n },\n setId(id: string) {\n newRef.setId(id);\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n\n throw new Error(`Failed to convert legacy route ref, unknown type '${type}'`);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convertLegacyRouteRef.esm.js","sources":["../src/convertLegacyRouteRef.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 */\n\nimport {\n RouteRef as LegacyRouteRef,\n SubRouteRef as LegacySubRouteRef,\n ExternalRouteRef as LegacyExternalRouteRef,\n AnyRouteRefParams,\n} from '@backstage/core-plugin-api';\n\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { routeRefType } from '../../core-plugin-api/src/routing/types';\n\nimport {\n RouteRef,\n SubRouteRef,\n ExternalRouteRef,\n createRouteRef,\n createSubRouteRef,\n createExternalRouteRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n OpaqueRouteRef,\n OpaqueSubRouteRef,\n OpaqueExternalRouteRef,\n} from '@internal/frontend';\n\n/**\n * Converts a legacy route ref type to the new system.\n *\n * @public\n */\nexport type ToNewRouteRef<\n T extends LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef,\n> = T extends LegacyRouteRef<infer IParams>\n ? RouteRef<IParams>\n : T extends LegacySubRouteRef<infer IParams>\n ? SubRouteRef<IParams>\n : T extends LegacyExternalRouteRef<infer IParams>\n ? ExternalRouteRef<IParams>\n : never;\n\n/**\n * Converts a collection of legacy route refs to the new system.\n * This is particularly useful when defining plugin `routes` and `externalRoutes`.\n *\n * @public\n */\nexport function convertLegacyRouteRefs<\n TRefs extends {\n [name in string]:\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef;\n },\n>(refs: TRefs): { [KName in keyof TRefs]: ToNewRouteRef<TRefs[KName]> } {\n return Object.fromEntries(\n Object.entries(refs).map(([name, ref]) => [\n name,\n convertLegacyRouteRef(ref as LegacyRouteRef),\n ]),\n ) as { [KName in keyof TRefs]: ToNewRouteRef<TRefs[KName]> };\n}\n\n/**\n * A temporary helper to convert a legacy route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacyRouteRef<TParams>,\n): RouteRef<TParams>;\n\n/**\n * A temporary helper to convert a legacy sub route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createSubRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacySubRouteRef<TParams>,\n): SubRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a legacy external route ref to the new system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createExternalRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: LegacyExternalRouteRef<TParams>,\n): ExternalRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: RouteRef<TParams>,\n): LegacyRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new sub route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createSubRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: SubRouteRef<TParams>,\n): LegacySubRouteRef<TParams>;\n\n/**\n * A temporary helper to convert a new external route ref to the legacy system.\n *\n * @public\n * @remarks\n *\n * In the future the legacy createExternalRouteRef will instead create refs compatible with both systems.\n */\nexport function convertLegacyRouteRef<TParams extends AnyRouteRefParams>(\n ref: ExternalRouteRef<TParams>,\n): LegacyExternalRouteRef<TParams, true>;\nexport function convertLegacyRouteRef(\n ref:\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef\n | RouteRef\n | SubRouteRef\n | ExternalRouteRef,\n):\n | RouteRef\n | SubRouteRef\n | ExternalRouteRef\n | LegacyRouteRef\n | LegacySubRouteRef\n | LegacyExternalRouteRef {\n const isNew = '$$type' in ref;\n const oldType = (ref as unknown as { [routeRefType]: unknown })[routeRefType];\n\n // Ref has already been converted\n if (isNew && oldType) {\n return ref as any;\n }\n\n if (isNew) {\n return convertNewToOld(\n ref as unknown as RouteRef | SubRouteRef | ExternalRouteRef,\n );\n }\n\n return convertOldToNew(ref, oldType);\n}\n\nfunction convertNewToOld(\n ref: RouteRef | SubRouteRef | ExternalRouteRef,\n): LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef {\n if (ref.$$type === '@backstage/RouteRef') {\n const newRef = OpaqueRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'absolute',\n params: newRef.getParams(),\n title: newRef.getDescription(),\n } as Omit<LegacyRouteRef, '$$routeRefType' | keyof RouteRef>) as unknown as LegacyRouteRef;\n }\n if (ref.$$type === '@backstage/SubRouteRef') {\n const newRef = OpaqueSubRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'sub',\n parent: convertLegacyRouteRef(newRef.getParent()),\n params: newRef.getParams(),\n } as Omit<LegacySubRouteRef, '$$routeRefType' | keyof SubRouteRef>) as unknown as LegacySubRouteRef;\n }\n if (ref.$$type === '@backstage/ExternalRouteRef') {\n const newRef = OpaqueExternalRouteRef.toInternal(ref);\n return Object.assign(ref, {\n [routeRefType]: 'external',\n optional: true,\n params: newRef.getParams(),\n defaultTarget: newRef.getDefaultTarget(),\n } as Omit<LegacyExternalRouteRef, '$$routeRefType' | keyof ExternalRouteRef>) as unknown as LegacyExternalRouteRef;\n }\n\n throw new Error(\n `Failed to convert route ref, unknown type '${(ref as any).$$type}'`,\n );\n}\n\nfunction convertOldToNew(\n ref: LegacyRouteRef | LegacySubRouteRef | LegacyExternalRouteRef,\n type: unknown,\n): RouteRef | SubRouteRef | ExternalRouteRef {\n if (type === 'absolute') {\n const legacyRef = ref as LegacyRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueRouteRef.toInternal(\n createRouteRef({\n params: legacyRef.params as string[],\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/RouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getDescription() {\n return legacyRefStr;\n },\n setId(id: string) {\n newRef.setId(id);\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n if (type === 'sub') {\n const legacyRef = ref as LegacySubRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueSubRouteRef.toInternal(\n createSubRouteRef({\n path: legacyRef.path,\n parent: convertLegacyRouteRef(legacyRef.parent),\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/SubRouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getParent() {\n return newRef.getParent();\n },\n getDescription() {\n return legacyRefStr;\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n if (type === 'external') {\n const legacyRef = ref as LegacyExternalRouteRef;\n const legacyRefStr = String(legacyRef);\n const newRef = OpaqueExternalRouteRef.toInternal(\n createExternalRouteRef<{ [key in string]: string }>({\n params: legacyRef.params as string[],\n defaultTarget:\n 'getDefaultTarget' in legacyRef\n ? (legacyRef.getDefaultTarget as () => string | undefined)()\n : undefined,\n }),\n );\n return Object.assign(legacyRef, {\n $$type: '@backstage/ExternalRouteRef' as const,\n version: 'v1',\n T: newRef.T,\n getParams() {\n return newRef.getParams();\n },\n getDescription() {\n return legacyRefStr;\n },\n // This might already be implemented in the legacy ref, but we override it just to be sure\n getDefaultTarget() {\n return newRef.getDefaultTarget();\n },\n setId(id: string) {\n newRef.setId(id);\n },\n toString() {\n return legacyRefStr;\n },\n });\n }\n\n throw new Error(`Failed to convert legacy route ref, unknown type '${type}'`);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode, JSX, ComponentType, PropsWithChildren } from 'react';
|
|
3
|
-
import { AnalyticsApi, AnalyticsEvent, AnyApiFactory, IconComponent, BackstagePlugin, AppComponents, AppTheme, FeatureFlag,
|
|
3
|
+
import { AnalyticsApi, AnalyticsEvent, AnyApiFactory, IconComponent, BackstagePlugin, AppComponents, AppTheme, FeatureFlag, RouteRef, SubRouteRef, ExternalRouteRef, AnyRouteRefParams } from '@backstage/core-plugin-api';
|
|
4
4
|
import { AnalyticsApi as AnalyticsApi$1, AnalyticsEvent as AnalyticsEvent$1, FrontendPlugin, FrontendModule, ExtensionDefinition, RouteRef as RouteRef$1, SubRouteRef as SubRouteRef$1, ExternalRouteRef as ExternalRouteRef$1, TypesToApiRefs } from '@backstage/frontend-plugin-api';
|
|
5
5
|
|
|
6
6
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/core-compat-api",
|
|
3
|
-
"version": "0.5.10-next.
|
|
3
|
+
"version": "0.5.10-next.1",
|
|
4
4
|
"backstage": {
|
|
5
5
|
"role": "web-library"
|
|
6
6
|
},
|
|
@@ -31,24 +31,24 @@
|
|
|
31
31
|
"test": "backstage-cli package test"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@backstage/core-plugin-api": "1.12.5-next.
|
|
34
|
+
"@backstage/core-plugin-api": "1.12.5-next.1",
|
|
35
35
|
"@backstage/errors": "1.2.7",
|
|
36
36
|
"@backstage/filter-predicates": "0.1.1",
|
|
37
|
-
"@backstage/frontend-plugin-api": "0.
|
|
38
|
-
"@backstage/plugin-app-react": "0.2.2-next.
|
|
39
|
-
"@backstage/plugin-catalog-react": "2.1.
|
|
37
|
+
"@backstage/frontend-plugin-api": "0.16.0-next.1",
|
|
38
|
+
"@backstage/plugin-app-react": "0.2.2-next.1",
|
|
39
|
+
"@backstage/plugin-catalog-react": "2.1.2-next.1",
|
|
40
40
|
"@backstage/types": "1.2.2",
|
|
41
41
|
"@backstage/version-bridge": "1.0.12",
|
|
42
42
|
"lodash": "^4.17.21",
|
|
43
43
|
"zod": "^3.25.76 || ^4.0.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@backstage/cli": "0.36.1-next.
|
|
47
|
-
"@backstage/core-app-api": "1.
|
|
48
|
-
"@backstage/frontend-app-api": "0.16.2-next.
|
|
49
|
-
"@backstage/frontend-test-utils": "0.5.2-next.
|
|
50
|
-
"@backstage/plugin-catalog": "2.0.2-next.
|
|
51
|
-
"@backstage/test-utils": "1.7.17-next.
|
|
46
|
+
"@backstage/cli": "0.36.1-next.1",
|
|
47
|
+
"@backstage/core-app-api": "1.20.0-next.1",
|
|
48
|
+
"@backstage/frontend-app-api": "0.16.2-next.1",
|
|
49
|
+
"@backstage/frontend-test-utils": "0.5.2-next.1",
|
|
50
|
+
"@backstage/plugin-catalog": "2.0.2-next.1",
|
|
51
|
+
"@backstage/test-utils": "1.7.17-next.1",
|
|
52
52
|
"@backstage/types": "1.2.2",
|
|
53
53
|
"@testing-library/jest-dom": "^6.0.0",
|
|
54
54
|
"@testing-library/react": "^16.0.0",
|