@backstage/frontend-app-api 0.0.0 → 0.1.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage/frontend-app-api
2
2
 
3
+ ## 0.1.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 628ca7e458e4: Initial release
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @backstage/frontend-plugin-api@0.1.0-next.0
13
+ - @backstage/plugin-graphiql@0.2.54-next.3
14
+ - @backstage/config@1.1.0-next.2
15
+ - @backstage/core-app-api@1.10.0-next.3
16
+ - @backstage/core-components@0.13.5-next.3
17
+ - @backstage/core-plugin-api@1.6.0-next.3
18
+ - @backstage/types@1.1.1-next.0
19
+
3
20
  ## 0.0.1-next.1
4
21
 
5
22
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { BackstagePlugin } from '@backstage/frontend-plugin-api';
3
+ import { ConfigApi } from '@backstage/core-plugin-api';
3
4
 
4
5
  /** @public */
5
6
  declare function createApp(options: {
6
7
  plugins: BackstagePlugin[];
8
+ config?: ConfigApi;
7
9
  }): {
8
10
  createRoot(): JSX.Element;
9
11
  };
package/dist/index.esm.js CHANGED
@@ -1,12 +1,59 @@
1
- import React, { createContext } from 'react';
1
+ import React, { createContext, useMemo, useState, useEffect } from 'react';
2
2
  import { ConfigReader } from '@backstage/config';
3
3
  import { createExtension, coreExtensionData } from '@backstage/frontend-plugin-api';
4
- import { BrowserRouter, useRoutes } from 'react-router-dom';
4
+ import { useRoutes, BrowserRouter, useInRouterContext, MemoryRouter } from 'react-router-dom';
5
+ import { SidebarPage, sidebarConfig, Sidebar, SidebarDivider, SidebarItem, useSidebarOpenState, Link, Progress, ErrorPage, ErrorPanel } from '@backstage/core-components';
6
+ import { makeStyles } from '@material-ui/core';
7
+ import { GraphiQLIcon } from '@backstage/plugin-graphiql';
5
8
  import mapValues from 'lodash/mapValues';
9
+ import { useApi, appThemeApiRef, FeatureFlagState, createApiFactory, discoveryApiRef, configApiRef, alertApiRef, analyticsApiRef, errorApiRef, storageApiRef, fetchApiRef, identityApiRef, oauthRequestApiRef, googleAuthApiRef, microsoftAuthApiRef, githubAuthApiRef, oktaAuthApiRef, gitlabAuthApiRef, oneloginAuthApiRef, bitbucketAuthApiRef, bitbucketServerAuthApiRef, atlassianAuthApiRef, featureFlagsApiRef } from '@backstage/core-plugin-api';
10
+ import { UrlPatternDiscovery, AlertApiForwarder, NoOpAnalyticsApi, ErrorAlerter, ErrorApiForwarder, UnhandledErrorForwarder, WebStorage, createFetchApi, FetchMiddlewares, OAuthRequestManager, GoogleAuth, MicrosoftAuth, GithubAuth, OktaAuth, GitlabAuth, OneLoginAuth, BitbucketAuth, BitbucketServerAuth, AtlassianAuth, ApiProvider, ApiFactoryRegistry, AppThemeSelector, ApiResolver } from '@backstage/core-app-api';
11
+ import useObservable from 'react-use/lib/useObservable';
12
+ import { createVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';
13
+ import { permissionApiRef, IdentityPermissionApi } from '@backstage/plugin-permission-react';
14
+ import Button from '@material-ui/core/Button';
15
+ import MuiApartmentIcon from '@material-ui/icons/Apartment';
16
+ import MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';
17
+ import MuiCategoryIcon from '@material-ui/icons/Category';
18
+ import MuiCreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';
19
+ import MuiSubjectIcon from '@material-ui/icons/Subject';
20
+ import MuiSearchIcon from '@material-ui/icons/Search';
21
+ import MuiChatIcon from '@material-ui/icons/Chat';
22
+ import MuiDashboardIcon from '@material-ui/icons/Dashboard';
23
+ import MuiDocsIcon from '@material-ui/icons/Description';
24
+ import MuiEmailIcon from '@material-ui/icons/Email';
25
+ import MuiExtensionIcon from '@material-ui/icons/Extension';
26
+ import MuiGitHubIcon from '@material-ui/icons/GitHub';
27
+ import MuiHelpIcon from '@material-ui/icons/Help';
28
+ import MuiLocationOnIcon from '@material-ui/icons/LocationOn';
29
+ import MuiMemoryIcon from '@material-ui/icons/Memory';
30
+ import MuiMenuBookIcon from '@material-ui/icons/MenuBook';
31
+ import MuiPeopleIcon from '@material-ui/icons/People';
32
+ import MuiPersonIcon from '@material-ui/icons/Person';
33
+ import MuiWarningIcon from '@material-ui/icons/Warning';
34
+ import MuiWorkIcon from '@material-ui/icons/Work';
35
+ import { UnifiedThemeProvider, themes as themes$1 } from '@backstage/theme';
36
+ import DarkIcon from '@material-ui/icons/Brightness2';
37
+ import LightIcon from '@material-ui/icons/WbSunny';
6
38
 
7
- const CoreRouter = createExtension({
8
- id: "core.router",
39
+ const Core = createExtension({
40
+ id: "core",
9
41
  at: "root",
42
+ inputs: {
43
+ apis: {
44
+ extensionData: {
45
+ api: coreExtensionData.apiFactory
46
+ }
47
+ }
48
+ },
49
+ output: {},
50
+ factory() {
51
+ }
52
+ });
53
+
54
+ const CoreRoutes = createExtension({
55
+ id: "core.routes",
56
+ at: "core.layout/content",
10
57
  inputs: {
11
58
  routes: {
12
59
  extensionData: {
@@ -30,7 +77,135 @@ const CoreRouter = createExtension({
30
77
  return element;
31
78
  };
32
79
  bind({
33
- component: () => /* @__PURE__ */ React.createElement(BrowserRouter, null, /* @__PURE__ */ React.createElement(Routes, null))
80
+ component: () => /* @__PURE__ */ React.createElement(Routes, null)
81
+ });
82
+ }
83
+ });
84
+
85
+ const CoreLayout = createExtension({
86
+ id: "core.layout",
87
+ at: "root",
88
+ inputs: {
89
+ nav: {
90
+ extensionData: {
91
+ component: coreExtensionData.reactComponent
92
+ }
93
+ },
94
+ content: {
95
+ extensionData: {
96
+ component: coreExtensionData.reactComponent
97
+ }
98
+ }
99
+ },
100
+ output: {
101
+ component: coreExtensionData.reactComponent
102
+ },
103
+ factory({ bind, inputs }) {
104
+ if (inputs.nav.length !== 1) {
105
+ throw Error(
106
+ `Extension 'core.layout' did not receive exactly one 'nav' input, got ${inputs.nav.length}`
107
+ );
108
+ }
109
+ const Nav = inputs.nav[0].component;
110
+ if (inputs.content.length !== 1) {
111
+ throw Error(
112
+ `Extension 'core.layout' did not receive exactly one 'content' input, got ${inputs.content.length}`
113
+ );
114
+ }
115
+ const Content = inputs.content[0].component;
116
+ bind({
117
+ // TODO: set base path using the logic from AppRouter
118
+ component: () => /* @__PURE__ */ React.createElement(SidebarPage, null, /* @__PURE__ */ React.createElement(Nav, null), /* @__PURE__ */ React.createElement(Content, null))
119
+ });
120
+ }
121
+ });
122
+
123
+ const useStyles$1 = makeStyles({
124
+ svg: {
125
+ width: "auto",
126
+ height: 28
127
+ },
128
+ path: {
129
+ fill: "#7df3e1"
130
+ }
131
+ });
132
+ const LogoIcon = () => {
133
+ const classes = useStyles$1();
134
+ return /* @__PURE__ */ React.createElement(
135
+ "svg",
136
+ {
137
+ className: classes.svg,
138
+ xmlns: "http://www.w3.org/2000/svg",
139
+ viewBox: "0 0 337.46 428.5"
140
+ },
141
+ /* @__PURE__ */ React.createElement(
142
+ "path",
143
+ {
144
+ className: classes.path,
145
+ d: "M303,166.05a80.69,80.69,0,0,0,13.45-10.37c.79-.77,1.55-1.53,2.3-2.3a83.12,83.12,0,0,0,7.93-9.38A63.69,63.69,0,0,0,333,133.23a48.58,48.58,0,0,0,4.35-16.4c1.49-19.39-10-38.67-35.62-54.22L198.56,0,78.3,115.23,0,190.25l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.22,49.22,0,0,0-6.8-8.87A89.17,89.17,0,0,0,259,178.29h.15a85.08,85.08,0,0,0,31-5.79A80.88,80.88,0,0,0,303,166.05ZM202.45,225.86c-19.32,18.51-50.4,21.23-75.7,5.9L51.61,186.15l67.45-64.64,76.41,46.38C223,184.58,221.49,207.61,202.45,225.86Zm8.93-82.22-70.65-42.89L205.14,39,274.51,81.1c25.94,15.72,29.31,37,10.55,55A60.69,60.69,0,0,1,211.38,143.64Zm29.86,190c-19.57,18.75-46.17,29.09-74.88,29.09a123.73,123.73,0,0,1-64.1-18.2L0,282.52v24.67L108.6,373.1a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.27,87.27,0,0,1,241.24,333.68Zm0-39c-19.57,18.75-46.17,29.08-74.88,29.08a123.81,123.81,0,0,1-64.1-18.19L0,243.53v24.68l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.5v-1.78A87.27,87.27,0,0,1,241.24,294.7Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.81,123.81,0,0,1-64.1-18.19L0,204.55v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.82A86.09,86.09,0,0,1,241.24,255.71Zm83.7,25.74a94.15,94.15,0,0,1-60.2,25.86h0V334a81.6,81.6,0,0,0,51.74-22.37c14-13.38,21.14-28.11,21-42.64v-2.19A94.92,94.92,0,0,1,324.94,281.45Zm-83.7,91.21c-19.57,18.76-46.17,29.09-74.88,29.09a123.73,123.73,0,0,1-64.1-18.2L0,321.5v24.68l108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A86.29,86.29,0,0,1,241.24,372.66ZM327,162.45c-.68.69-1.35,1.38-2.05,2.06a94.37,94.37,0,0,1-10.64,8.65,91.35,91.35,0,0,1-11.6,7,94.53,94.53,0,0,1-26.24,8.71,97.69,97.69,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a53.27,53.27,0,0,1,1.14,12V217h.05a84.41,84.41,0,0,0,25.35-5.55,81,81,0,0,0,26.39-16.82c.8-.77,1.5-1.56,2.26-2.34a82.08,82.08,0,0,0,7.93-9.38A63.76,63.76,0,0,0,333,172.17a48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7V150q-1.08,1.54-2.25,3.09A96.73,96.73,0,0,1,327,162.45Zm0,77.92c-.69.7-1.31,1.41-2,2.1a94.2,94.2,0,0,1-60.2,25.86h0l0,26.67h0a81.6,81.6,0,0,0,51.74-22.37A73.51,73.51,0,0,0,333,250.13a48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.47.19-3.71v-2.19c-.74,1.07-1.46,2.15-2.27,3.21A95.68,95.68,0,0,1,327,240.37Zm0-39c-.69.7-1.31,1.41-2,2.1a93.18,93.18,0,0,1-10.63,8.65,91.63,91.63,0,0,1-11.63,7,95.47,95.47,0,0,1-37.94,10.18h0V256h0a81.65,81.65,0,0,0,51.74-22.37c.8-.77,1.5-1.56,2.26-2.34a82.08,82.08,0,0,0,7.93-9.38A63.76,63.76,0,0,0,333,211.15a48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.46,2.16-2.27,3.22A95.68,95.68,0,0,1,327,201.39Z"
146
+ }
147
+ )
148
+ );
149
+ };
150
+
151
+ const useStyles = makeStyles({
152
+ svg: {
153
+ width: "auto",
154
+ height: 30
155
+ },
156
+ path: {
157
+ fill: "#7df3e1"
158
+ }
159
+ });
160
+ const LogoFull = () => {
161
+ const classes = useStyles();
162
+ return /* @__PURE__ */ React.createElement(
163
+ "svg",
164
+ {
165
+ className: classes.svg,
166
+ xmlns: "http://www.w3.org/2000/svg",
167
+ viewBox: "0 0 2079.95 456.05"
168
+ },
169
+ /* @__PURE__ */ React.createElement(
170
+ "path",
171
+ {
172
+ className: classes.path,
173
+ d: "M302.9,180a80.62,80.62,0,0,0,13.44-10.37c.8-.77,1.55-1.54,2.31-2.31a81.89,81.89,0,0,0,7.92-9.37,62.37,62.37,0,0,0,6.27-10.77,48.6,48.6,0,0,0,4.36-16.4c1.49-19.39-10-38.67-35.62-54.22L198.42,14,78.16,129.22l-78.29,75,108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.69,49.69,0,0,0-6.8-8.87,89.78,89.78,0,0,0,19.28,2.15H259a85.09,85.09,0,0,0,31-5.79A80.88,80.88,0,0,0,302.9,180Zm-100.59,59.8c-19.32,18.51-50.4,21.24-75.7,5.9l-75.13-45.6,67.44-64.65,76.42,46.39C222.88,198.57,221.36,221.6,202.31,239.84Zm8.94-82.21L140.6,114.74,205,53l69.37,42.11c25.94,15.73,29.31,37.05,10.55,55A60.71,60.71,0,0,1,211.25,157.63Zm29.86,190c-19.57,18.75-46.17,29.08-74.88,29.08a123.84,123.84,0,0,1-64.11-18.19L-.13,296.51v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.85,87.85,0,0,1,241.11,347.67Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,257.52V282.2l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.79A86.86,86.86,0,0,1,241.11,308.68Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,218.54v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.12,19.68-41.49v-1.82A87.14,87.14,0,0,1,241.11,269.7Zm83.69,25.74a94.16,94.16,0,0,1-60.19,25.86h0V348a81.6,81.6,0,0,0,51.73-22.37c14-13.38,21.15-28.11,21-42.64v-2.2A95.14,95.14,0,0,1,324.8,295.44Zm-83.69,91.21c-19.57,18.75-46.17,29.09-74.88,29.09a123.76,123.76,0,0,1-64.11-18.2L-.13,335.49v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.35,87.35,0,0,1,241.11,386.65Zm85.75-210.21c-.68.69-1.35,1.38-2.06,2.05a99.19,99.19,0,0,1-22.23,15.69,94.53,94.53,0,0,1-26.24,8.71,97.84,97.84,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a52.7,52.7,0,0,1,1.13,12V231h.05A84.48,84.48,0,0,0,290,225.47a80.83,80.83,0,0,0,26.38-16.82c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,62.85,62.85,0,0,0,6.29-10.78,48.5,48.5,0,0,0,4.32-16.44c.09-1.23.2-2.47.19-3.7v-2c-.72,1-1.48,2.06-2.26,3.09A98,98,0,0,1,326.86,176.44Zm0,77.92c-.68.7-1.3,1.41-2,2.1a94.09,94.09,0,0,1-60.19,25.85h0V309h0a81.65,81.65,0,0,0,51.73-22.37,73.51,73.51,0,0,0,16.48-22.49,48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A95.81,95.81,0,0,1,326.82,254.36Zm0-39c-.68.7-1.3,1.41-2,2.1a92.22,92.22,0,0,1-10.62,8.65,93.53,93.53,0,0,1-11.63,7,95.63,95.63,0,0,1-37.94,10.18h-.05l0,26.67h0a81.63,81.63,0,0,0,51.73-22.37c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,63.16,63.16,0,0,0,6.29-10.77,48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A98.19,98.19,0,0,1,326.82,215.38Zm241-88.84q7.94,0,17.09.17t18.12,1a139.3,139.3,0,0,1,16.74,2.57,42.78,42.78,0,0,1,13.3,5.14,64.27,64.27,0,0,1,20.54,19.89Q662,168,662,186.54q0,19.54-9.49,33.78t-27.1,21.09v.68q22.78,4.82,34.87,20.58t12.08,38.4a72.62,72.62,0,0,1-4.83,26.06,65.29,65.29,0,0,1-14.33,22.46,71.57,71.57,0,0,1-23.47,15.78q-14,6-32.28,6H478.38V126.54Zm9,105.27q28,0,40.21-9.78t12.26-29.31q0-13-4.14-20.58a29.47,29.47,0,0,0-11.4-11.66A45,45,0,0,0,597,155.17a161.2,161.2,0,0,0-20.19-1.2h-65.6v77.84Zm16.57,112.13q21.74,0,34-11.66T639.59,300q0-12-4.48-19.88a34.85,34.85,0,0,0-11.91-12.52,50.14,50.14,0,0,0-17.09-6.52,105,105,0,0,0-20-1.88H511.17v84.7Zm274.79,26.74q-7.61,4.45-21.06,4.46-11.4,0-18.12-6.34t-6.74-20.75a70.17,70.17,0,0,1-28.13,20.75,97.87,97.87,0,0,1-57.65,3.6,53.51,53.51,0,0,1-18.82-8.58A41.19,41.19,0,0,1,705,348.56q-4.65-9.42-4.66-22.8,0-15.09,5.18-24.69a44.92,44.92,0,0,1,13.64-15.6,62.63,62.63,0,0,1,19.33-9.09q10.88-3.08,22.27-5.14,12.08-2.4,23-3.6a128,128,0,0,0,19.16-3.43c5.53-1.48,9.89-3.65,13.12-6.51s4.83-7,4.83-12.52q0-9.6-3.62-15.43a24.94,24.94,0,0,0-9.32-8.92,38.38,38.38,0,0,0-12.78-4.11,96.54,96.54,0,0,0-14-1q-18.63,0-31.07,7T736.6,249.29H707.26q.69-16.46,6.9-27.77a52.21,52.21,0,0,1,16.57-18.35,70,70,0,0,1,23.65-10.11A125.51,125.51,0,0,1,782.86,190a168.63,168.63,0,0,1,24,1.72,63.26,63.26,0,0,1,21.58,7A41.23,41.23,0,0,1,844,213.59q5.87,9.57,5.87,25v91q0,10.26,1.21,15.05t8.11,4.79a35.57,35.57,0,0,0,9-1.37Zm-47.64-90.87c-3.69,2.74-8.52,4.72-14.5,6s-12.26,2.27-18.82,3.07-13.17,1.71-19.85,2.73a73.7,73.7,0,0,0-18,4.94,32.62,32.62,0,0,0-12.94,9.73q-5,6.32-5,17.23a23.31,23.31,0,0,0,2.94,12.11,24.11,24.11,0,0,0,7.59,8,32,32,0,0,0,10.88,4.44,60.94,60.94,0,0,0,13.11,1.36q14.5,0,24.86-3.92a52.49,52.49,0,0,0,16.91-9.9,39.1,39.1,0,0,0,9.67-13,32.53,32.53,0,0,0,3.11-13.14ZM1002.07,225q-11.05-9.25-29.69-9.26-15.89,0-26.58,5.83A47.29,47.29,0,0,0,928.71,237a64.66,64.66,0,0,0-9.15,22.12A119.83,119.83,0,0,0,916.8,285a98.22,98.22,0,0,0,2.93,24,64.18,64.18,0,0,0,9.15,20.74,46.2,46.2,0,0,0,16.23,14.58q10,5.49,23.82,5.48,21.75,0,34-11.31t15-31.89h30q-4.83,32.91-24.68,50.75t-54,17.83q-20.37,0-36.07-6.52A69.86,69.86,0,0,1,907,350.11a79.92,79.92,0,0,1-15.88-28.63A118.64,118.64,0,0,1,885.73,285a129.41,129.41,0,0,1,5.18-37.21,85.63,85.63,0,0,1,15.71-30.17A73.46,73.46,0,0,1,933,197.35Q948.91,190,970,190a108.54,108.54,0,0,1,28.48,3.6,69.59,69.59,0,0,1,23.48,11.15,61,61,0,0,1,16.74,19q6.55,11.49,8.29,27.26h-30.38Q1013.11,234.21,1002.07,225Zm109.77-98.41v145l81.47-77.49h39.36l-70.77,64.46,75.95,112.82h-37.29l-61.1-92.59-27.62,25.38v67.21H1082.5V126.54Zm170.54,205.22a31.07,31.07,0,0,0,10.87,10.63,49,49,0,0,0,15.19,5.66,87.06,87.06,0,0,0,17.44,1.71,109.18,109.18,0,0,0,14.5-1,53.22,53.22,0,0,0,14-3.78,26.27,26.27,0,0,0,10.53-8q4.14-5.32,4.14-13.55,0-11.31-8.63-17.14a73.69,73.69,0,0,0-21.58-9.43q-12.94-3.6-28.13-6.52a146,146,0,0,1-28.14-8.23A58.16,58.16,0,0,1,1261,267.13q-8.64-9.6-8.63-26.75,0-13.38,6-23a49.26,49.26,0,0,1,15.53-15.61,71.76,71.76,0,0,1,21.4-8.91A99.41,99.41,0,0,1,1319,190a141.31,141.31,0,0,1,28,2.58,64.85,64.85,0,0,1,22.62,8.91,46.16,46.16,0,0,1,15.7,17.15q5.87,10.8,6.91,26.91h-29.35q-.69-8.57-4.48-14.23a29.36,29.36,0,0,0-9.67-9.08,44.16,44.16,0,0,0-12.94-5,67.68,67.68,0,0,0-14.33-1.54,87.29,87.29,0,0,0-13.29,1,45.28,45.28,0,0,0-12.26,3.6,24.49,24.49,0,0,0-9,6.86q-3.46,4.29-3.46,11.14a16.32,16.32,0,0,0,5.36,12.52,42.75,42.75,0,0,0,13.63,8.23,120,120,0,0,0,18.64,5.48q10.37,2.24,20.72,4.63,11,2.4,21.57,5.83A70.74,70.74,0,0,1,1382,284.1a44.55,44.55,0,0,1,13.12,14.23q5,8.58,5,21.26,0,16.13-6.73,26.75a52.5,52.5,0,0,1-17.61,17.14,73.89,73.89,0,0,1-24.51,9.09,146.3,146.3,0,0,1-27.1,2.57,126.24,126.24,0,0,1-28.31-3.09A69.56,69.56,0,0,1,1272,361.94a51.74,51.74,0,0,1-16.57-18.52q-6.21-11.49-6.9-27.95h29.34A32.65,32.65,0,0,0,1282.38,331.76Zm226.46-137.67v25.72h-35.56V329.88a31.37,31.37,0,0,0,.87,8.23,8.42,8.42,0,0,0,3.28,4.8,14.61,14.61,0,0,0,6.73,2.23,99.19,99.19,0,0,0,11.22.51h13.46v25.72H1486.4a105.8,105.8,0,0,1-19.5-1.55,28.65,28.65,0,0,1-13.12-5.65,24.09,24.09,0,0,1-7.42-11.66q-2.43-7.54-2.42-19.89V219.81h-30.38V194.09h30.38V140.94h29.34v53.15ZM1699.4,370.68q-7.61,4.45-21.06,4.46-11.4,0-18.12-6.34t-6.74-20.75a70.17,70.17,0,0,1-28.13,20.75,97.87,97.87,0,0,1-57.65,3.6,53.51,53.51,0,0,1-18.82-8.58,41.19,41.19,0,0,1-12.6-15.26q-4.65-9.42-4.66-22.8,0-15.09,5.18-24.69a44.92,44.92,0,0,1,13.64-15.6,62.63,62.63,0,0,1,19.33-9.09q10.88-3.08,22.27-5.14,12.07-2.4,23-3.6a128,128,0,0,0,19.16-3.43c5.53-1.48,9.89-3.65,13.12-6.51s4.83-7,4.83-12.52q0-9.6-3.62-15.43a24.94,24.94,0,0,0-9.32-8.92,38.38,38.38,0,0,0-12.78-4.11,96.54,96.54,0,0,0-14-1q-18.63,0-31.07,7t-13.46,26.57h-29.34q.67-16.46,6.9-27.77A52.21,52.21,0,0,1,1562,203.17a70,70,0,0,1,23.65-10.11,125.51,125.51,0,0,1,28.48-3.09,168.63,168.63,0,0,1,24,1.72,63.26,63.26,0,0,1,21.58,7,41.23,41.23,0,0,1,15.53,14.89q5.87,9.57,5.87,25v91q0,10.26,1.21,15.05t8.11,4.79a35.57,35.57,0,0,0,9-1.37Zm-47.64-90.87c-3.69,2.74-8.52,4.72-14.5,6s-12.26,2.27-18.82,3.07-13.17,1.71-19.85,2.73a73.7,73.7,0,0,0-17.95,4.94,32.62,32.62,0,0,0-12.94,9.73q-5,6.32-5,17.23a23.31,23.31,0,0,0,2.94,12.11,24.11,24.11,0,0,0,7.59,8,32,32,0,0,0,10.88,4.44,60.94,60.94,0,0,0,13.11,1.36q14.51,0,24.86-3.92a52.49,52.49,0,0,0,16.91-9.9,39.1,39.1,0,0,0,9.67-13,32.53,32.53,0,0,0,3.11-13.14Zm208.85,141.62q-20,21.6-62.83,21.6a122.11,122.11,0,0,1-25.37-2.74,78,78,0,0,1-23.48-8.92,54.41,54.41,0,0,1-17.43-16.11q-6.91-10-7.6-24.35h29.35a21.47,21.47,0,0,0,5,13.38,36.67,36.67,0,0,0,11.4,8.91,55.52,55.52,0,0,0,14.67,5,79.51,79.51,0,0,0,15.19,1.55q14.49,0,24.51-5A46,46,0,0,0,1840.59,401a56.53,56.53,0,0,0,9.49-21.09,117.46,117.46,0,0,0,2.94-27.09V341.19h-.7q-7.59,16.46-23,24.18a71.8,71.8,0,0,1-32.63,7.71q-20,0-34.86-7.2A72.88,72.88,0,0,1,1737,346.51a82.13,82.13,0,0,1-15-28.46,116.62,116.62,0,0,1-5-34.47,133.92,133.92,0,0,1,4.14-32.4A88.17,88.17,0,0,1,1735,221a75.49,75.49,0,0,1,25.55-22.29q15.87-8.75,39-8.75a66.21,66.21,0,0,1,31.07,7.38,52.13,52.13,0,0,1,22.09,22.11h.35V194.09h27.61V356.28Q1880.63,399.83,1860.61,421.43Zm-37.46-79.72a47.94,47.94,0,0,0,16.4-15.78,71.89,71.89,0,0,0,9.15-22.11,106.77,106.77,0,0,0,2.93-24.69,96.71,96.71,0,0,0-2.76-23,64,64,0,0,0-8.8-20.4,45.76,45.76,0,0,0-15.71-14.57q-9.66-5.49-23.47-5.49-14.16,0-24.17,5.32a46.77,46.77,0,0,0-16.4,14.23,60.14,60.14,0,0,0-9.32,20.57,99.69,99.69,0,0,0-2.93,24.35,120.63,120.63,0,0,0,2.42,24,67.5,67.5,0,0,0,8.28,21.77,46.37,46.37,0,0,0,15.54,15.78q9.66,6,24.16,6T1823.15,341.71Zm228,18.34q-20,15.09-50.41,15.09-21.4,0-37.11-6.86a73.16,73.16,0,0,1-26.41-19.2,81.52,81.52,0,0,1-16-29.49,141.12,141.12,0,0,1-6-37.38,106.1,106.1,0,0,1,6.21-37A88.56,88.56,0,0,1,1938.8,216a79.09,79.09,0,0,1,26.58-19.2A81.66,81.66,0,0,1,1999,190q23.82,0,39.53,9.78a78,78,0,0,1,25.2,24.86,98.18,98.18,0,0,1,13.12,32.91,140.6,140.6,0,0,1,2.93,34h-133.6a70,70,0,0,0,2.76,22.12,49.9,49.9,0,0,0,10,18.51A49.1,49.1,0,0,0,1976.6,345q10.7,4.82,25.2,4.8,18.65,0,30.55-8.57t15.71-26.06h29Q2071.18,345,2051.17,360.05Zm-7.08-113.84a50,50,0,0,0-10.7-16,53.1,53.1,0,0,0-56.62-10.63,47.48,47.48,0,0,0-15.71,10.81,51.69,51.69,0,0,0-10.35,15.94,60.18,60.18,0,0,0-4.49,19.37h102.53A59.47,59.47,0,0,0,2044.09,246.21ZM302.9,180a80.62,80.62,0,0,0,13.44-10.37c.8-.77,1.55-1.54,2.31-2.31a81.89,81.89,0,0,0,7.92-9.37,62.37,62.37,0,0,0,6.27-10.77,48.6,48.6,0,0,0,4.36-16.4c1.49-19.39-10-38.67-35.62-54.22L198.42,14,78.16,129.22l-78.29,75,108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.69,49.69,0,0,0-6.8-8.87,89.78,89.78,0,0,0,19.28,2.15H259a85.09,85.09,0,0,0,31-5.79A80.88,80.88,0,0,0,302.9,180Zm-100.59,59.8c-19.32,18.51-50.4,21.24-75.7,5.9l-75.13-45.6,67.44-64.65,76.42,46.39C222.88,198.57,221.36,221.6,202.31,239.84Zm8.94-82.21L140.6,114.74,205,53l69.37,42.11c25.94,15.73,29.31,37.05,10.55,55A60.71,60.71,0,0,1,211.25,157.63Zm29.86,190c-19.57,18.75-46.17,29.08-74.88,29.08a123.84,123.84,0,0,1-64.11-18.19L-.13,296.51v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.85,87.85,0,0,1,241.11,347.67Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,257.52V282.2l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.79A86.86,86.86,0,0,1,241.11,308.68Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,218.54v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.12,19.68-41.49v-1.82A87.14,87.14,0,0,1,241.11,269.7Zm83.69,25.74a94.16,94.16,0,0,1-60.19,25.86h0V348a81.6,81.6,0,0,0,51.73-22.37c14-13.38,21.15-28.11,21-42.64v-2.2A95.14,95.14,0,0,1,324.8,295.44Zm-83.69,91.21c-19.57,18.75-46.17,29.09-74.88,29.09a123.76,123.76,0,0,1-64.11-18.2L-.13,335.49v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.35,87.35,0,0,1,241.11,386.65Zm85.75-210.21c-.68.69-1.35,1.38-2.06,2.05a99.19,99.19,0,0,1-22.23,15.69,94.53,94.53,0,0,1-26.24,8.71,97.84,97.84,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a52.7,52.7,0,0,1,1.13,12V231h.05A84.48,84.48,0,0,0,290,225.47a80.83,80.83,0,0,0,26.38-16.82c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,62.85,62.85,0,0,0,6.29-10.78,48.5,48.5,0,0,0,4.32-16.44c.09-1.23.2-2.47.19-3.7v-2c-.72,1-1.48,2.06-2.26,3.09A98,98,0,0,1,326.86,176.44Zm0,77.92c-.68.7-1.3,1.41-2,2.1a94.09,94.09,0,0,1-60.19,25.85h0V309h0a81.65,81.65,0,0,0,51.73-22.37,73.51,73.51,0,0,0,16.48-22.49,48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A95.81,95.81,0,0,1,326.82,254.36Zm0-39c-.68.7-1.3,1.41-2,2.1a92.22,92.22,0,0,1-10.62,8.65,93.53,93.53,0,0,1-11.63,7,95.63,95.63,0,0,1-37.94,10.18h-.05l0,26.67h0a81.63,81.63,0,0,0,51.73-22.37c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,63.16,63.16,0,0,0,6.29-10.77,48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A98.19,98.19,0,0,1,326.82,215.38Z"
174
+ }
175
+ )
176
+ );
177
+ };
178
+
179
+ const useSidebarLogoStyles = makeStyles({
180
+ root: {
181
+ width: sidebarConfig.drawerWidthClosed,
182
+ height: 3 * sidebarConfig.logoHeight,
183
+ display: "flex",
184
+ flexFlow: "row nowrap",
185
+ alignItems: "center",
186
+ marginBottom: -14
187
+ },
188
+ link: {
189
+ width: sidebarConfig.drawerWidthClosed,
190
+ marginLeft: 24
191
+ }
192
+ });
193
+ const SidebarLogo = () => {
194
+ const classes = useSidebarLogoStyles();
195
+ const { isOpen } = useSidebarOpenState();
196
+ return /* @__PURE__ */ React.createElement("div", { className: classes.root }, /* @__PURE__ */ React.createElement(Link, { to: "/", underline: "none", className: classes.link, "aria-label": "Home" }, isOpen ? /* @__PURE__ */ React.createElement(LogoFull, null) : /* @__PURE__ */ React.createElement(LogoIcon, null)));
197
+ };
198
+ const CoreNav = createExtension({
199
+ id: "core.nav",
200
+ at: "core.layout/nav",
201
+ inputs: {},
202
+ output: {
203
+ component: coreExtensionData.reactComponent
204
+ },
205
+ factory({ bind }) {
206
+ bind({
207
+ // TODO: set base path using the logic from AppRouter
208
+ component: () => /* @__PURE__ */ React.createElement(Sidebar, null, /* @__PURE__ */ React.createElement(SidebarLogo, null), /* @__PURE__ */ React.createElement(SidebarDivider, null), /* @__PURE__ */ React.createElement(SidebarItem, { icon: GraphiQLIcon, to: "graphiql", text: "GraphiQL" }))
34
209
  });
35
210
  }
36
211
  });
@@ -67,7 +242,7 @@ function createExtensionInstance(options) {
67
242
  ({ extensionData: pointData }, inputName) => {
68
243
  var _a2;
69
244
  return ((_a2 = attachments.get(inputName)) != null ? _a2 : []).map(
70
- (attachment) => mapValues(pointData, (ref) => attachment.data.get(ref.id))
245
+ (attachment) => mapValues(pointData, (ref) => attachment.getData(ref))
71
246
  );
72
247
  }
73
248
  )
@@ -78,10 +253,12 @@ function createExtensionInstance(options) {
78
253
  );
79
254
  }
80
255
  return {
256
+ $$type: "@backstage/ExtensionInstance",
81
257
  id: options.extension.id,
82
- data: extensionData,
83
- attachments,
84
- $$type: "extension-instance"
258
+ getData(ref) {
259
+ return extensionData.get(ref.id);
260
+ },
261
+ attachments
85
262
  };
86
263
  }
87
264
 
@@ -263,18 +440,520 @@ function getAvailablePlugins() {
263
440
  }
264
441
  function isBackstagePlugin(obj) {
265
442
  if (obj !== null && typeof obj === "object" && "$$type" in obj) {
266
- return obj.$$type === "backstage-plugin";
443
+ return obj.$$type === "@backstage/BackstagePlugin";
267
444
  }
268
445
  return false;
269
446
  }
270
447
 
448
+ function resolveTheme(themeId, shouldPreferDark, themes) {
449
+ if (themeId !== void 0) {
450
+ const selectedTheme = themes.find((theme) => theme.id === themeId);
451
+ if (selectedTheme) {
452
+ return selectedTheme;
453
+ }
454
+ }
455
+ if (shouldPreferDark) {
456
+ const darkTheme = themes.find((theme) => theme.variant === "dark");
457
+ if (darkTheme) {
458
+ return darkTheme;
459
+ }
460
+ }
461
+ const lightTheme = themes.find((theme) => theme.variant === "light");
462
+ if (lightTheme) {
463
+ return lightTheme;
464
+ }
465
+ return themes[0];
466
+ }
467
+ const useShouldPreferDarkTheme = () => {
468
+ const mediaQuery = useMemo(
469
+ () => window.matchMedia("(prefers-color-scheme: dark)"),
470
+ []
471
+ );
472
+ const [shouldPreferDark, setPrefersDark] = useState(mediaQuery.matches);
473
+ useEffect(() => {
474
+ const listener = (event) => {
475
+ setPrefersDark(event.matches);
476
+ };
477
+ mediaQuery.addListener(listener);
478
+ return () => {
479
+ mediaQuery.removeListener(listener);
480
+ };
481
+ }, [mediaQuery]);
482
+ return shouldPreferDark;
483
+ };
484
+ function AppThemeProvider({ children }) {
485
+ const appThemeApi = useApi(appThemeApiRef);
486
+ const themeId = useObservable(
487
+ appThemeApi.activeThemeId$(),
488
+ appThemeApi.getActiveThemeId()
489
+ );
490
+ const shouldPreferDark = Boolean(window.matchMedia) ? useShouldPreferDarkTheme() : false;
491
+ const appTheme = resolveTheme(
492
+ themeId,
493
+ shouldPreferDark,
494
+ appThemeApi.getInstalledThemes()
495
+ );
496
+ if (!appTheme) {
497
+ throw new Error("App has no themes");
498
+ }
499
+ return /* @__PURE__ */ React.createElement(appTheme.Provider, { children });
500
+ }
501
+
502
+ const AppContext = createVersionedContext("app-context");
503
+ const AppContextProvider = ({
504
+ appContext,
505
+ children
506
+ }) => {
507
+ const versionedValue = createVersionedValueMap({ 1: appContext });
508
+ return /* @__PURE__ */ React.createElement(AppContext.Provider, { value: versionedValue, children });
509
+ };
510
+
511
+ var __defProp = Object.defineProperty;
512
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
513
+ var __publicField = (obj, key, value) => {
514
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
515
+ return value;
516
+ };
517
+ function validateFlagName(name) {
518
+ if (name.length < 3) {
519
+ throw new Error(
520
+ `The '${name}' feature flag must have a minimum length of three characters.`
521
+ );
522
+ }
523
+ if (name.length > 150) {
524
+ throw new Error(
525
+ `The '${name}' feature flag must not exceed 150 characters.`
526
+ );
527
+ }
528
+ if (!name.match(/^[a-z]+[a-z0-9-]+$/)) {
529
+ throw new Error(
530
+ `The '${name}' feature flag must start with a lowercase letter and only contain lowercase letters, numbers and hyphens. Examples: feature-flag-one, alpha, release-2020`
531
+ );
532
+ }
533
+ }
534
+ class LocalStorageFeatureFlags {
535
+ constructor() {
536
+ __publicField(this, "registeredFeatureFlags", []);
537
+ __publicField(this, "flags");
538
+ }
539
+ registerFlag(flag) {
540
+ validateFlagName(flag.name);
541
+ this.registeredFeatureFlags.push(flag);
542
+ }
543
+ getRegisteredFlags() {
544
+ return this.registeredFeatureFlags.slice();
545
+ }
546
+ isActive(name) {
547
+ if (!this.flags) {
548
+ this.flags = this.load();
549
+ }
550
+ return this.flags.get(name) === FeatureFlagState.Active;
551
+ }
552
+ save(options) {
553
+ if (!this.flags) {
554
+ this.flags = this.load();
555
+ }
556
+ if (!options.merge) {
557
+ this.flags.clear();
558
+ }
559
+ for (const [name, state] of Object.entries(options.states)) {
560
+ this.flags.set(name, state);
561
+ }
562
+ const enabled = Array.from(this.flags.entries()).filter(
563
+ ([, state]) => state === FeatureFlagState.Active
564
+ );
565
+ window.localStorage.setItem(
566
+ "featureFlags",
567
+ JSON.stringify(Object.fromEntries(enabled))
568
+ );
569
+ }
570
+ load() {
571
+ try {
572
+ const jsonStr = window.localStorage.getItem("featureFlags");
573
+ if (!jsonStr) {
574
+ return /* @__PURE__ */ new Map();
575
+ }
576
+ const json = JSON.parse(jsonStr);
577
+ if (typeof json !== "object" || json === null || Array.isArray(json)) {
578
+ return /* @__PURE__ */ new Map();
579
+ }
580
+ const entries = Object.entries(json).filter(([name, value]) => {
581
+ validateFlagName(name);
582
+ return value === FeatureFlagState.Active;
583
+ });
584
+ return new Map(entries);
585
+ } catch {
586
+ return /* @__PURE__ */ new Map();
587
+ }
588
+ }
589
+ }
590
+
591
+ function defaultConfigLoaderSync(runtimeConfigJson = "__APP_INJECTED_RUNTIME_CONFIG__") {
592
+ const appConfig = process.env.APP_CONFIG;
593
+ if (!appConfig) {
594
+ throw new Error("No static configuration provided");
595
+ }
596
+ if (!Array.isArray(appConfig)) {
597
+ throw new Error("Static configuration has invalid format");
598
+ }
599
+ const configs = appConfig.slice();
600
+ if (runtimeConfigJson !== "__app_injected_runtime_config__".toLocaleUpperCase("en-US")) {
601
+ try {
602
+ const data = JSON.parse(runtimeConfigJson);
603
+ if (Array.isArray(data)) {
604
+ configs.push(...data);
605
+ } else {
606
+ configs.push({ data, context: "env" });
607
+ }
608
+ } catch (error) {
609
+ throw new Error(`Failed to load runtime configuration, ${error}`);
610
+ }
611
+ }
612
+ const windowAppConfig = window.__APP_CONFIG__;
613
+ if (windowAppConfig) {
614
+ configs.push({
615
+ context: "window",
616
+ data: windowAppConfig
617
+ });
618
+ }
619
+ return configs;
620
+ }
621
+
622
+ function createLocalBaseUrl(fullUrl) {
623
+ const url = new URL(fullUrl);
624
+ url.protocol = document.location.protocol;
625
+ url.hostname = document.location.hostname;
626
+ url.port = document.location.port;
627
+ return url.toString().replace(/\/$/, "");
628
+ }
629
+ function overrideBaseUrlConfigs(inputConfigs) {
630
+ const urlConfigReader = ConfigReader.fromConfigs(inputConfigs);
631
+ const appBaseUrl = urlConfigReader.getOptionalString("app.baseUrl");
632
+ const backendBaseUrl = urlConfigReader.getOptionalString("backend.baseUrl");
633
+ let configs = inputConfigs;
634
+ let newBackendBaseUrl = void 0;
635
+ let newAppBaseUrl = void 0;
636
+ if (appBaseUrl && backendBaseUrl) {
637
+ const appOrigin = new URL(appBaseUrl).origin;
638
+ const backendOrigin = new URL(backendBaseUrl).origin;
639
+ if (appOrigin === backendOrigin) {
640
+ const maybeNewBackendBaseUrl = createLocalBaseUrl(backendBaseUrl);
641
+ if (backendBaseUrl !== maybeNewBackendBaseUrl) {
642
+ newBackendBaseUrl = maybeNewBackendBaseUrl;
643
+ }
644
+ }
645
+ }
646
+ if (appBaseUrl) {
647
+ const maybeNewAppBaseUrl = createLocalBaseUrl(appBaseUrl);
648
+ if (appBaseUrl !== maybeNewAppBaseUrl) {
649
+ newAppBaseUrl = maybeNewAppBaseUrl;
650
+ }
651
+ }
652
+ if (newAppBaseUrl || newBackendBaseUrl) {
653
+ configs = configs.concat({
654
+ data: {
655
+ app: newAppBaseUrl && {
656
+ baseUrl: newAppBaseUrl
657
+ },
658
+ backend: newBackendBaseUrl && {
659
+ baseUrl: newBackendBaseUrl
660
+ }
661
+ },
662
+ context: "relative-resolver"
663
+ });
664
+ }
665
+ return configs;
666
+ }
667
+
668
+ const apis = [
669
+ createApiFactory({
670
+ api: discoveryApiRef,
671
+ deps: { configApi: configApiRef },
672
+ factory: ({ configApi }) => UrlPatternDiscovery.compile(
673
+ `${configApi.getString("backend.baseUrl")}/api/{{ pluginId }}`
674
+ )
675
+ }),
676
+ createApiFactory({
677
+ api: alertApiRef,
678
+ deps: {},
679
+ factory: () => new AlertApiForwarder()
680
+ }),
681
+ createApiFactory({
682
+ api: analyticsApiRef,
683
+ deps: {},
684
+ factory: () => new NoOpAnalyticsApi()
685
+ }),
686
+ createApiFactory({
687
+ api: errorApiRef,
688
+ deps: { alertApi: alertApiRef },
689
+ factory: ({ alertApi }) => {
690
+ const errorApi = new ErrorAlerter(alertApi, new ErrorApiForwarder());
691
+ UnhandledErrorForwarder.forward(errorApi, { hidden: false });
692
+ return errorApi;
693
+ }
694
+ }),
695
+ createApiFactory({
696
+ api: storageApiRef,
697
+ deps: { errorApi: errorApiRef },
698
+ factory: ({ errorApi }) => WebStorage.create({ errorApi })
699
+ }),
700
+ createApiFactory({
701
+ api: fetchApiRef,
702
+ deps: {
703
+ configApi: configApiRef,
704
+ identityApi: identityApiRef,
705
+ discoveryApi: discoveryApiRef
706
+ },
707
+ factory: ({ configApi, identityApi, discoveryApi }) => {
708
+ return createFetchApi({
709
+ middleware: [
710
+ FetchMiddlewares.resolvePluginProtocol({
711
+ discoveryApi
712
+ }),
713
+ FetchMiddlewares.injectIdentityAuth({
714
+ identityApi,
715
+ config: configApi
716
+ })
717
+ ]
718
+ });
719
+ }
720
+ }),
721
+ createApiFactory({
722
+ api: oauthRequestApiRef,
723
+ deps: {},
724
+ factory: () => new OAuthRequestManager()
725
+ }),
726
+ createApiFactory({
727
+ api: googleAuthApiRef,
728
+ deps: {
729
+ discoveryApi: discoveryApiRef,
730
+ oauthRequestApi: oauthRequestApiRef,
731
+ configApi: configApiRef
732
+ },
733
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => GoogleAuth.create({
734
+ configApi,
735
+ discoveryApi,
736
+ oauthRequestApi,
737
+ environment: configApi.getOptionalString("auth.environment")
738
+ })
739
+ }),
740
+ createApiFactory({
741
+ api: microsoftAuthApiRef,
742
+ deps: {
743
+ discoveryApi: discoveryApiRef,
744
+ oauthRequestApi: oauthRequestApiRef,
745
+ configApi: configApiRef
746
+ },
747
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => MicrosoftAuth.create({
748
+ configApi,
749
+ discoveryApi,
750
+ oauthRequestApi,
751
+ environment: configApi.getOptionalString("auth.environment")
752
+ })
753
+ }),
754
+ createApiFactory({
755
+ api: githubAuthApiRef,
756
+ deps: {
757
+ discoveryApi: discoveryApiRef,
758
+ oauthRequestApi: oauthRequestApiRef,
759
+ configApi: configApiRef
760
+ },
761
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => GithubAuth.create({
762
+ configApi,
763
+ discoveryApi,
764
+ oauthRequestApi,
765
+ defaultScopes: ["read:user"],
766
+ environment: configApi.getOptionalString("auth.environment")
767
+ })
768
+ }),
769
+ createApiFactory({
770
+ api: oktaAuthApiRef,
771
+ deps: {
772
+ discoveryApi: discoveryApiRef,
773
+ oauthRequestApi: oauthRequestApiRef,
774
+ configApi: configApiRef
775
+ },
776
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => OktaAuth.create({
777
+ configApi,
778
+ discoveryApi,
779
+ oauthRequestApi,
780
+ environment: configApi.getOptionalString("auth.environment")
781
+ })
782
+ }),
783
+ createApiFactory({
784
+ api: gitlabAuthApiRef,
785
+ deps: {
786
+ discoveryApi: discoveryApiRef,
787
+ oauthRequestApi: oauthRequestApiRef,
788
+ configApi: configApiRef
789
+ },
790
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => GitlabAuth.create({
791
+ configApi,
792
+ discoveryApi,
793
+ oauthRequestApi,
794
+ environment: configApi.getOptionalString("auth.environment")
795
+ })
796
+ }),
797
+ createApiFactory({
798
+ api: oneloginAuthApiRef,
799
+ deps: {
800
+ discoveryApi: discoveryApiRef,
801
+ oauthRequestApi: oauthRequestApiRef,
802
+ configApi: configApiRef
803
+ },
804
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => OneLoginAuth.create({
805
+ configApi,
806
+ discoveryApi,
807
+ oauthRequestApi,
808
+ environment: configApi.getOptionalString("auth.environment")
809
+ })
810
+ }),
811
+ createApiFactory({
812
+ api: bitbucketAuthApiRef,
813
+ deps: {
814
+ discoveryApi: discoveryApiRef,
815
+ oauthRequestApi: oauthRequestApiRef,
816
+ configApi: configApiRef
817
+ },
818
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => BitbucketAuth.create({
819
+ configApi,
820
+ discoveryApi,
821
+ oauthRequestApi,
822
+ defaultScopes: ["team"],
823
+ environment: configApi.getOptionalString("auth.environment")
824
+ })
825
+ }),
826
+ createApiFactory({
827
+ api: bitbucketServerAuthApiRef,
828
+ deps: {
829
+ discoveryApi: discoveryApiRef,
830
+ oauthRequestApi: oauthRequestApiRef,
831
+ configApi: configApiRef
832
+ },
833
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => BitbucketServerAuth.create({
834
+ configApi,
835
+ discoveryApi,
836
+ oauthRequestApi,
837
+ defaultScopes: ["REPO_READ"]
838
+ })
839
+ }),
840
+ createApiFactory({
841
+ api: atlassianAuthApiRef,
842
+ deps: {
843
+ discoveryApi: discoveryApiRef,
844
+ oauthRequestApi: oauthRequestApiRef,
845
+ configApi: configApiRef
846
+ },
847
+ factory: ({ discoveryApi, oauthRequestApi, configApi }) => {
848
+ return AtlassianAuth.create({
849
+ configApi,
850
+ discoveryApi,
851
+ oauthRequestApi,
852
+ environment: configApi.getOptionalString("auth.environment")
853
+ });
854
+ }
855
+ }),
856
+ createApiFactory({
857
+ api: permissionApiRef,
858
+ deps: {
859
+ discovery: discoveryApiRef,
860
+ identity: identityApiRef,
861
+ config: configApiRef
862
+ },
863
+ factory: ({ config, discovery, identity }) => IdentityPermissionApi.create({ config, discovery, identity })
864
+ })
865
+ ];
866
+
867
+ function OptionallyWrapInRouter({ children }) {
868
+ if (useInRouterContext()) {
869
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
870
+ }
871
+ return /* @__PURE__ */ React.createElement(MemoryRouter, null, children);
872
+ }
873
+ const DefaultNotFoundPage = () => /* @__PURE__ */ React.createElement(ErrorPage, { status: "404", statusMessage: "PAGE NOT FOUND" });
874
+ const DefaultBootErrorPage = ({ step, error }) => {
875
+ let message = "";
876
+ if (step === "load-config") {
877
+ message = `The configuration failed to load, someone should have a look at this error: ${error.message}`;
878
+ } else if (step === "load-chunk") {
879
+ message = `Lazy loaded chunk failed to load, try to reload the page: ${error.message}`;
880
+ }
881
+ return /* @__PURE__ */ React.createElement(OptionallyWrapInRouter, null, /* @__PURE__ */ React.createElement(ErrorPage, { status: "501", statusMessage: message }));
882
+ };
883
+ const DefaultErrorBoundaryFallback = ({
884
+ error,
885
+ resetError,
886
+ plugin
887
+ }) => {
888
+ return /* @__PURE__ */ React.createElement(
889
+ ErrorPanel,
890
+ {
891
+ title: `Error in ${plugin == null ? void 0 : plugin.getId()}`,
892
+ defaultExpanded: true,
893
+ error
894
+ },
895
+ /* @__PURE__ */ React.createElement(Button, { variant: "outlined", onClick: resetError }, "Retry")
896
+ );
897
+ };
898
+ const components = {
899
+ Progress,
900
+ Router: BrowserRouter,
901
+ NotFoundErrorPage: DefaultNotFoundPage,
902
+ BootErrorPage: DefaultBootErrorPage,
903
+ ErrorBoundaryFallback: DefaultErrorBoundaryFallback
904
+ };
905
+
906
+ const icons = {
907
+ brokenImage: MuiBrokenImageIcon,
908
+ // To be confirmed: see https://github.com/backstage/backstage/issues/4970
909
+ catalog: MuiMenuBookIcon,
910
+ scaffolder: MuiCreateNewFolderIcon,
911
+ techdocs: MuiSubjectIcon,
912
+ search: MuiSearchIcon,
913
+ chat: MuiChatIcon,
914
+ dashboard: MuiDashboardIcon,
915
+ docs: MuiDocsIcon,
916
+ email: MuiEmailIcon,
917
+ github: MuiGitHubIcon,
918
+ group: MuiPeopleIcon,
919
+ help: MuiHelpIcon,
920
+ "kind:api": MuiExtensionIcon,
921
+ "kind:component": MuiMemoryIcon,
922
+ "kind:domain": MuiApartmentIcon,
923
+ "kind:group": MuiPeopleIcon,
924
+ "kind:location": MuiLocationOnIcon,
925
+ "kind:system": MuiCategoryIcon,
926
+ "kind:user": MuiPersonIcon,
927
+ "kind:resource": MuiWorkIcon,
928
+ user: MuiPersonIcon,
929
+ warning: MuiWarningIcon
930
+ };
931
+
932
+ const themes = [
933
+ {
934
+ id: "light",
935
+ title: "Light Theme",
936
+ variant: "light",
937
+ icon: /* @__PURE__ */ React.createElement(LightIcon, null),
938
+ Provider: ({ children }) => /* @__PURE__ */ React.createElement(UnifiedThemeProvider, { theme: themes$1.light, children })
939
+ },
940
+ {
941
+ id: "dark",
942
+ title: "Dark Theme",
943
+ variant: "dark",
944
+ icon: /* @__PURE__ */ React.createElement(DarkIcon, null),
945
+ Provider: ({ children }) => /* @__PURE__ */ React.createElement(UnifiedThemeProvider, { theme: themes$1.dark, children })
946
+ }
947
+ ];
948
+
271
949
  function createApp(options) {
272
- var _a, _b;
273
- const appConfig = ConfigReader.fromConfigs(process.env.APP_CONFIG);
274
- const builtinExtensions = [CoreRouter];
950
+ var _a, _b, _c;
951
+ const appConfig = (_a = options == null ? void 0 : options.config) != null ? _a : ConfigReader.fromConfigs(overrideBaseUrlConfigs(defaultConfigLoaderSync()));
952
+ const builtinExtensions = [Core, CoreRoutes, CoreNav, CoreLayout];
275
953
  const discoveredPlugins = getAvailablePlugins();
954
+ const allPlugins = [...discoveredPlugins, ...options.plugins];
276
955
  const extensionParams = mergeExtensionParameters({
277
- sources: [...options.plugins, ...discoveredPlugins],
956
+ sources: allPlugins,
278
957
  builtinExtensions,
279
958
  parameters: readAppExtensionParameters(appConfig)
280
959
  });
@@ -317,30 +996,100 @@ function createApp(options) {
317
996
  instances.set(instanceParams.extension.id, newInstance);
318
997
  return newInstance;
319
998
  }
320
- const rootConfigs = (_b = (_a = attachmentMap.get("root")) == null ? void 0 : _a.get("default")) != null ? _b : [];
999
+ const rootConfigs = (_c = (_b = attachmentMap.get("root")) == null ? void 0 : _b.get("default")) != null ? _c : [];
321
1000
  const rootInstances = rootConfigs.map(
322
1001
  (instanceParams) => createInstance(instanceParams)
323
1002
  );
324
1003
  const routePaths = extractRouteInfoFromInstanceTree(rootInstances);
1004
+ const coreInstance = rootInstances.find(({ id }) => id === "core");
1005
+ if (!coreInstance) {
1006
+ throw Error("Unable to find core extension instance");
1007
+ }
1008
+ const apiHolder = createApiHolder(coreInstance, appConfig);
1009
+ const appContext = createLegacyAppContext(allPlugins);
325
1010
  return {
326
1011
  createRoot() {
327
- const rootComponents = rootInstances.map(
328
- (e) => e.data.get(
329
- coreExtensionData.reactComponent.id
330
- )
331
- );
332
- return /* @__PURE__ */ React.createElement(RoutingProvider, { routePaths }, rootComponents.map((Component, i) => /* @__PURE__ */ React.createElement(Component, { key: i })));
1012
+ const rootComponents = rootInstances.map((e) => e.getData(coreExtensionData.reactComponent)).filter((x) => !!x);
1013
+ return /* @__PURE__ */ React.createElement(ApiProvider, { apis: apiHolder }, /* @__PURE__ */ React.createElement(AppContextProvider, { appContext }, /* @__PURE__ */ React.createElement(AppThemeProvider, null, /* @__PURE__ */ React.createElement(RoutingProvider, { routePaths }, /* @__PURE__ */ React.createElement(BrowserRouter, null, rootComponents.map((Component, i) => /* @__PURE__ */ React.createElement(Component, { key: i })))))));
333
1014
  }
334
1015
  };
335
1016
  }
1017
+ function toLegacyPlugin(plugin) {
1018
+ const errorMsg = "Not implemented in legacy plugin compatibility layer";
1019
+ const notImplemented = () => {
1020
+ throw new Error(errorMsg);
1021
+ };
1022
+ return {
1023
+ getId() {
1024
+ return plugin.id;
1025
+ },
1026
+ get routes() {
1027
+ throw new Error(errorMsg);
1028
+ },
1029
+ get externalRoutes() {
1030
+ throw new Error(errorMsg);
1031
+ },
1032
+ getApis: notImplemented,
1033
+ getFeatureFlags: notImplemented,
1034
+ provide: notImplemented,
1035
+ __experimentalReconfigure: notImplemented
1036
+ };
1037
+ }
1038
+ function createLegacyAppContext(plugins) {
1039
+ return {
1040
+ getPlugins() {
1041
+ return plugins.map(toLegacyPlugin);
1042
+ },
1043
+ getSystemIcon(key) {
1044
+ return key in icons ? icons[key] : void 0;
1045
+ },
1046
+ getSystemIcons() {
1047
+ return icons;
1048
+ },
1049
+ getComponents() {
1050
+ return components;
1051
+ }
1052
+ };
1053
+ }
1054
+ function createApiHolder(coreExtension, configApi) {
1055
+ var _a, _b;
1056
+ const factoryRegistry = new ApiFactoryRegistry();
1057
+ const apiFactories = (_b = (_a = coreExtension.attachments.get("apis")) == null ? void 0 : _a.map((e) => e.getData(coreExtensionData.apiFactory)).filter((x) => !!x)) != null ? _b : [];
1058
+ for (const factory of apiFactories) {
1059
+ factoryRegistry.register("default", factory);
1060
+ }
1061
+ factoryRegistry.register("default", {
1062
+ api: featureFlagsApiRef,
1063
+ deps: {},
1064
+ factory: () => new LocalStorageFeatureFlags()
1065
+ });
1066
+ factoryRegistry.register("static", {
1067
+ api: appThemeApiRef,
1068
+ deps: {},
1069
+ // TODO: add extension for registering themes
1070
+ factory: () => AppThemeSelector.createWithStorage(themes)
1071
+ });
1072
+ factoryRegistry.register("static", {
1073
+ api: configApiRef,
1074
+ deps: {},
1075
+ factory: () => configApi
1076
+ });
1077
+ for (const factory of apis) {
1078
+ if (!factoryRegistry.register("app", factory)) {
1079
+ throw new Error(
1080
+ `Duplicate or forbidden API factory for ${factory.api} in app`
1081
+ );
1082
+ }
1083
+ }
1084
+ ApiResolver.validateFactories(factoryRegistry, factoryRegistry.getAllApis());
1085
+ return new ApiResolver(factoryRegistry);
1086
+ }
336
1087
  function extractRouteInfoFromInstanceTree(roots) {
337
1088
  const results = /* @__PURE__ */ new Map();
338
1089
  function visit(current, basePath) {
339
1090
  var _a;
340
- const routePath = (_a = current.data.get(coreExtensionData.routePath.id)) != null ? _a : "";
341
- const routeRef = current.data.get(
342
- coreExtensionData.routeRef.id
343
- );
1091
+ const routePath = (_a = current.getData(coreExtensionData.routePath)) != null ? _a : "";
1092
+ const routeRef = current.getData(coreExtensionData.routeRef);
344
1093
  const fullPath = basePath + routePath;
345
1094
  if (routeRef) {
346
1095
  const routeRefId = routeRef.id;
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/extensions/CoreRouter.tsx","../src/createExtensionInstance.ts","../src/wiring/parameters.ts","../src/routing/RoutingContext.tsx","../src/wiring/discovery.ts","../src/createApp.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 React from 'react';\nimport {\n createExtension,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { BrowserRouter, useRoutes } from 'react-router-dom';\n\nexport const CoreRouter = createExtension({\n id: 'core.router',\n at: 'root',\n inputs: {\n routes: {\n extensionData: {\n path: coreExtensionData.routePath,\n ref: coreExtensionData.routeRef,\n component: coreExtensionData.reactComponent,\n },\n },\n },\n output: {\n component: coreExtensionData.reactComponent,\n },\n factory({ bind, inputs }) {\n const Routes = () => {\n const element = useRoutes(\n inputs.routes.map(route => ({\n path: route.path,\n element: <route.component />,\n })),\n );\n\n return element;\n };\n bind({\n component: () => (\n <BrowserRouter>\n <Routes />\n </BrowserRouter>\n ),\n });\n },\n});\n","/*\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 { BackstagePlugin, Extension } from '@backstage/frontend-plugin-api';\nimport mapValues from 'lodash/mapValues';\n\n/** @internal */\nexport interface ExtensionInstance {\n readonly id: string;\n /**\n * Maps extension data ref IDs to extensions produced.\n */\n readonly data: Map<string, unknown>;\n /**\n * Maps input names to the actual instances given to them.\n */\n readonly attachments: Map<string, ExtensionInstance[]>;\n readonly $$type: 'extension-instance';\n}\n\n/** @internal */\nexport function createExtensionInstance(options: {\n extension: Extension<unknown>;\n config: unknown;\n source?: BackstagePlugin;\n attachments: Map<string, ExtensionInstance[]>;\n}): ExtensionInstance {\n const { extension, config, source, attachments } = options;\n const extensionData = new Map<string, unknown>();\n\n let parsedConfig: unknown;\n try {\n parsedConfig = extension.configSchema?.parse(config ?? {});\n } catch (e) {\n throw new Error(\n `Invalid configuration for extension instance '${extension.id}', ${e}`,\n );\n }\n\n try {\n extension.factory({\n source,\n config: parsedConfig,\n bind: namedOutputs => {\n for (const [name, output] of Object.entries(namedOutputs)) {\n const ref = extension.output[name];\n if (!ref) {\n throw new Error(\n `Extension instance '${extension.id}' tried to bind unknown output '${name}'`,\n );\n }\n extensionData.set(ref.id, output);\n }\n },\n inputs: mapValues(\n extension.inputs,\n ({ extensionData: pointData }, inputName) => {\n // TODO: validation\n return (attachments.get(inputName) ?? []).map(attachment =>\n mapValues(pointData, ref => attachment.data.get(ref.id)),\n );\n },\n ),\n });\n } catch (e) {\n throw new Error(\n `Failed to instantiate extension instance '${extension.id}', ${e}`,\n );\n }\n\n return {\n id: options.extension.id,\n data: extensionData,\n attachments,\n $$type: 'extension-instance',\n };\n}\n","/*\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 { Config } from '@backstage/config';\nimport { BackstagePlugin, Extension } from '@backstage/frontend-plugin-api';\nimport { JsonValue } from '@backstage/types';\n\nexport interface ExtensionParameters {\n id: string;\n at?: string;\n disabled?: boolean;\n config?: unknown;\n}\n\nconst knownExtensionParameters = ['at', 'disabled', 'config'];\n\n// Since we'll never merge arrays in config the config reader context\n// isn't too much of a help. Fall back to manual config reading logic\n// as the Config interface makes it quite hard for us otherwise.\n/** @internal */\nexport function readAppExtensionParameters(\n rootConfig: Config,\n): ExtensionParameters[] {\n const arr = rootConfig.getOptional('app.extensions');\n if (!Array.isArray(arr)) {\n if (arr === undefined) {\n return [];\n }\n // This will throw, and show which part of config had the wrong type\n rootConfig.getConfigArray('app.extensions');\n return [];\n }\n\n return arr.map((arrayEntry, arrayIndex) =>\n expandShorthandExtensionParameters(arrayEntry, arrayIndex),\n );\n}\n\n/** @internal */\nexport function expandShorthandExtensionParameters(\n arrayEntry: JsonValue,\n arrayIndex: number,\n): ExtensionParameters {\n function errorMsg(msg: string, key?: string, prop?: string) {\n return `Invalid extension configuration at app.extensions[${arrayIndex}]${\n key ? `[${key}]` : ''\n }${prop ? `.${prop}` : ''}, ${msg}`;\n }\n\n // NOTE(freben): This check is intentionally not complete and doesn't check\n // whether letters and digits are used, etc. It's not up to the config reading\n // logic to decide what constitutes a valid extension ID; that should be\n // decided by the logic that loads and instantiates the extensions. This check\n // is just here to catch real mistakes or truly conceptually wrong input.\n function assertValidId(id: string) {\n if (!id || id !== id.trim()) {\n throw new Error(\n errorMsg('extension ID must not be empty or contain whitespace'),\n );\n }\n\n if (id.includes('/')) {\n let message = `extension ID must not contain slashes; got '${id}'`;\n const good = id.split('/')[0];\n if (good) {\n message += `, did you mean '${good}'?`;\n }\n throw new Error(errorMsg(message));\n }\n }\n\n // Example YAML:\n // - entity.card.about\n if (typeof arrayEntry === 'string') {\n assertValidId(arrayEntry);\n return {\n id: arrayEntry,\n disabled: false,\n };\n }\n\n // All remaining cases are single-key objects\n if (\n typeof arrayEntry !== 'object' ||\n arrayEntry === null ||\n Array.isArray(arrayEntry)\n ) {\n throw new Error(errorMsg('must be a string or an object'));\n }\n const keys = Object.keys(arrayEntry);\n if (keys.length !== 1) {\n const joinedKeys = keys.length ? `'${keys.join(\"', '\")}'` : 'none';\n throw new Error(errorMsg(`must have exactly one key, got ${joinedKeys}`));\n }\n\n const id = String(keys[0]);\n const value = arrayEntry[id];\n assertValidId(id);\n\n // This example covers a potentially common mistake in the syntax\n // Example YAML:\n // - entity.card.about:\n if (value === null) {\n return {\n id,\n disabled: false,\n };\n }\n\n // Example YAML:\n // - catalog.page.cicd: false\n if (typeof value === 'boolean') {\n return {\n id,\n disabled: !value,\n };\n }\n\n // The remaining case is the generic object. Example YAML:\n // - tech-radar.page:\n // at: core.router/routes\n // disabled: false\n // config:\n // path: /tech-radar\n // width: 1500\n // height: 800\n if (typeof value !== 'object' || Array.isArray(value)) {\n // We don't mention null here - we don't want people to explicitly enter\n // - entity.card.about: null\n throw new Error(errorMsg('value must be a boolean or object', id));\n }\n\n const at = value.at;\n const disabled = value.disabled;\n const config = value.config;\n\n if (at !== undefined && typeof at !== 'string') {\n throw new Error(errorMsg('must be a string', id, 'at'));\n } else if (disabled !== undefined && typeof disabled !== 'boolean') {\n throw new Error(errorMsg('must be a boolean', id, 'disabled'));\n } else if (\n config !== undefined &&\n (typeof config !== 'object' || config === null || Array.isArray(config))\n ) {\n throw new Error(errorMsg('must be an object', id, 'config'));\n }\n\n const unknownKeys = Object.keys(value).filter(\n k => !knownExtensionParameters.includes(k),\n );\n if (unknownKeys.length > 0) {\n throw new Error(\n errorMsg(\n `unknown parameter; expected one of '${knownExtensionParameters.join(\n \"', '\",\n )}'`,\n id,\n unknownKeys.join(', '),\n ),\n );\n }\n\n return {\n id,\n at,\n disabled,\n config,\n };\n}\n\nexport interface ExtensionInstanceParameters {\n extension: Extension<unknown>;\n source?: BackstagePlugin;\n at: string;\n config?: unknown;\n}\n\n/** @internal */\nexport function mergeExtensionParameters(options: {\n sources: BackstagePlugin[];\n builtinExtensions: Extension<unknown>[];\n parameters: Array<ExtensionParameters>;\n}): ExtensionInstanceParameters[] {\n const { sources, builtinExtensions, parameters } = options;\n\n const overrides = [\n ...sources.flatMap(plugin =>\n plugin.extensions.map(extension => ({\n extension,\n params: {\n source: plugin,\n at: extension.at,\n disabled: extension.disabled,\n config: undefined as unknown,\n },\n })),\n ),\n ...builtinExtensions.map(extension => ({\n extension,\n params: {\n source: undefined,\n at: extension.at,\n disabled: extension.disabled,\n config: undefined as unknown,\n },\n })),\n ];\n\n for (const overrideParam of parameters) {\n const existingIndex = overrides.findIndex(\n e => e.extension.id === overrideParam.id,\n );\n if (existingIndex !== -1) {\n const existing = overrides[existingIndex];\n if (overrideParam.at) {\n existing.params.at = overrideParam.at;\n }\n if (overrideParam.config) {\n // TODO: merge config?\n existing.params.config = overrideParam.config;\n }\n if (\n Boolean(existing.params.disabled) !== Boolean(overrideParam.disabled)\n ) {\n existing.params.disabled = Boolean(overrideParam.disabled);\n if (!existing.params.disabled) {\n // bump\n overrides.splice(existingIndex, 1);\n overrides.push(existing);\n }\n }\n } else {\n throw new Error(`Extension ${overrideParam.id} does not exist`);\n }\n }\n\n return overrides\n .filter(override => !override.params.disabled)\n .map(param => ({\n extension: param.extension,\n at: param.params.at,\n source: param.params.source,\n config: param.params.config,\n }));\n}\n","/*\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 { RouteRef } from '@backstage/core-plugin-api';\nimport React, { createContext, ReactNode } from 'react';\n\nexport interface RoutingContextType {\n resolve(\n routeRef: RouteRef,\n options: { pathname: string },\n ): (() => string) | undefined;\n}\n\nexport const RoutingContext = createContext<RoutingContextType>({\n resolve: () => () => '',\n});\n\nexport class RouteResolver {\n constructor(private readonly routePaths: Map<RouteRef, string>) {}\n\n resolve(anyRouteRef: RouteRef<{}>): (() => string) | undefined {\n const basePath = this.routePaths.get(anyRouteRef);\n if (!basePath) {\n return undefined;\n }\n return () => basePath;\n }\n}\n\nexport function RoutingProvider(props: {\n routePaths: Map<RouteRef, string>;\n children?: ReactNode;\n}) {\n return (\n <RoutingContext.Provider value={new RouteResolver(props.routePaths)}>\n {props.children}\n </RoutingContext.Provider>\n );\n}\n","/*\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 { BackstagePlugin } from '@backstage/frontend-plugin-api';\n\ninterface DiscoveryGlobal {\n modules: Array<{ name: string; default: unknown }>;\n}\n\n/**\n * @public\n */\nexport function getAvailablePlugins(): BackstagePlugin[] {\n const discovered = (\n window as { '__@backstage/discovered__'?: DiscoveryGlobal }\n )['__@backstage/discovered__'];\n\n return (\n discovered?.modules.map(m => m.default).filter(isBackstagePlugin) ?? []\n );\n}\n\nfunction isBackstagePlugin(obj: unknown): obj is BackstagePlugin {\n if (obj !== null && typeof obj === 'object' && '$$type' in obj) {\n return obj.$$type === 'backstage-plugin';\n }\n return false;\n}\n","/*\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 React from 'react';\nimport { ConfigReader } from '@backstage/config';\nimport {\n BackstagePlugin,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { CoreRouter } from './extensions/CoreRouter';\nimport {\n createExtensionInstance,\n ExtensionInstance,\n} from './createExtensionInstance';\nimport {\n ExtensionInstanceParameters,\n mergeExtensionParameters,\n readAppExtensionParameters,\n} from './wiring/parameters';\nimport { RoutingProvider } from './routing/RoutingContext';\nimport { RouteRef } from '@backstage/core-plugin-api';\nimport { getAvailablePlugins } from './wiring/discovery';\n\n/** @public */\nexport function createApp(options: { plugins: BackstagePlugin[] }): {\n createRoot(): JSX.Element;\n} {\n const appConfig = ConfigReader.fromConfigs(process.env.APP_CONFIG as any);\n\n const builtinExtensions = [CoreRouter];\n const discoveredPlugins = getAvailablePlugins();\n\n // pull in default extension instance from discovered packages\n // apply config to adjust default extension instances and add more\n const extensionParams = mergeExtensionParameters({\n sources: [...options.plugins, ...discoveredPlugins],\n builtinExtensions,\n parameters: readAppExtensionParameters(appConfig),\n });\n\n // TODO: validate the config of all extension instances\n // We do it at this point to ensure that merging (if any) of config has already happened\n\n // Create attachment map so that we can look attachments up during instance creation\n const attachmentMap = new Map<\n string,\n Map<string, ExtensionInstanceParameters[]>\n >();\n for (const instanceParams of extensionParams) {\n const [extensionId, pointId = 'default'] = instanceParams.at.split('/');\n\n let pointMap = attachmentMap.get(extensionId);\n if (!pointMap) {\n pointMap = new Map();\n attachmentMap.set(extensionId, pointMap);\n }\n\n let instances = pointMap.get(pointId);\n if (!instances) {\n instances = [];\n pointMap.set(pointId, instances);\n }\n\n instances.push(instanceParams);\n }\n\n const instances = new Map<string, ExtensionInstance>();\n\n function createInstance(\n instanceParams: ExtensionInstanceParameters,\n ): ExtensionInstance {\n const existingInstance = instances.get(instanceParams.extension.id);\n if (existingInstance) {\n return existingInstance;\n }\n\n const attachments = new Map(\n Array.from(\n attachmentMap.get(instanceParams.extension.id)?.entries() ?? [],\n ).map(([inputName, attachmentConfigs]) => [\n inputName,\n attachmentConfigs.map(createInstance),\n ]),\n );\n\n const newInstance = createExtensionInstance({\n extension: instanceParams.extension,\n source: instanceParams.source,\n config: instanceParams.config,\n attachments,\n });\n\n instances.set(instanceParams.extension.id, newInstance);\n\n return newInstance;\n }\n\n const rootConfigs = attachmentMap.get('root')?.get('default') ?? [];\n const rootInstances = rootConfigs.map(instanceParams =>\n createInstance(instanceParams),\n );\n\n const routePaths = extractRouteInfoFromInstanceTree(rootInstances);\n\n return {\n createRoot() {\n const rootComponents = rootInstances.map(\n e =>\n e.data.get(\n coreExtensionData.reactComponent.id,\n ) as typeof coreExtensionData.reactComponent.T,\n );\n return (\n <RoutingProvider routePaths={routePaths}>\n {rootComponents.map((Component, i) => (\n <Component key={i} />\n ))}\n </RoutingProvider>\n );\n },\n };\n}\n\n/** @internal */\nexport function extractRouteInfoFromInstanceTree(\n roots: ExtensionInstance[],\n): Map<RouteRef, string> {\n const results = new Map<RouteRef, string>();\n\n function visit(current: ExtensionInstance, basePath: string) {\n const routePath = current.data.get(coreExtensionData.routePath.id) ?? '';\n const routeRef = current.data.get(\n coreExtensionData.routeRef.id,\n ) as RouteRef;\n\n // TODO: join paths in a more robust way\n const fullPath = basePath + routePath;\n if (routeRef) {\n const routeRefId = (routeRef as any).id; // TODO: properly\n if (routeRefId !== current.id) {\n throw new Error(\n `Route ref '${routeRefId}' must have the same ID as extension '${current.id}'`,\n );\n }\n results.set(routeRef, fullPath);\n }\n\n for (const children of current.attachments.values()) {\n for (const child of children) {\n visit(child, fullPath);\n }\n }\n }\n\n for (const root of roots) {\n visit(root, '');\n }\n return results;\n}\n"],"names":["_a","id","instances","_b"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/extensions/Core.tsx","../src/extensions/CoreRoutes.tsx","../src/extensions/CoreLayout.tsx","../../app/src/components/Root/LogoIcon.jsx","../../app/src/components/Root/LogoFull.tsx","../src/extensions/CoreNav.tsx","../src/wiring/createExtensionInstance.ts","../src/wiring/parameters.ts","../src/routing/RoutingContext.tsx","../src/wiring/discovery.ts","../../core-app-api/src/app/AppThemeProvider.tsx","../../core-app-api/src/app/AppContext.tsx","../../core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.tsx","../../core-app-api/src/app/defaultConfigLoader.ts","../../core-app-api/src/app/overrideBaseUrlConfigs.ts","../../app-defaults/src/defaults/apis.ts","../../app-defaults/src/defaults/components.tsx","../../app-defaults/src/defaults/icons.tsx","../../app-defaults/src/defaults/themes.tsx","../src/wiring/createApp.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 coreExtensionData,\n createExtension,\n} from '@backstage/frontend-plugin-api';\n\nexport const Core = createExtension({\n id: 'core',\n at: 'root',\n inputs: {\n apis: {\n extensionData: {\n api: coreExtensionData.apiFactory,\n },\n },\n },\n output: {},\n factory() {},\n});\n","/*\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 React from 'react';\nimport {\n createExtension,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { useRoutes } from 'react-router-dom';\n\nexport const CoreRoutes = createExtension({\n id: 'core.routes',\n at: 'core.layout/content',\n inputs: {\n routes: {\n extensionData: {\n path: coreExtensionData.routePath,\n ref: coreExtensionData.routeRef,\n component: coreExtensionData.reactComponent,\n },\n },\n },\n output: {\n component: coreExtensionData.reactComponent,\n },\n factory({ bind, inputs }) {\n const Routes = () => {\n const element = useRoutes(\n inputs.routes.map(route => ({\n path: route.path,\n element: <route.component />,\n })),\n );\n\n return element;\n };\n bind({\n component: () => <Routes />,\n });\n },\n});\n","/*\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 React from 'react';\nimport {\n createExtension,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { SidebarPage } from '@backstage/core-components';\n\nexport const CoreLayout = createExtension({\n id: 'core.layout',\n at: 'root',\n inputs: {\n nav: {\n extensionData: {\n component: coreExtensionData.reactComponent,\n },\n },\n content: {\n extensionData: {\n component: coreExtensionData.reactComponent,\n },\n },\n },\n output: {\n component: coreExtensionData.reactComponent,\n },\n factory({ bind, inputs }) {\n // TODO: Support this as part of the core system\n if (inputs.nav.length !== 1) {\n throw Error(\n `Extension 'core.layout' did not receive exactly one 'nav' input, got ${inputs.nav.length}`,\n );\n }\n const Nav = inputs.nav[0].component;\n\n if (inputs.content.length !== 1) {\n throw Error(\n `Extension 'core.layout' did not receive exactly one 'content' input, got ${inputs.content.length}`,\n );\n }\n const Content = inputs.content[0].component;\n\n bind({\n // TODO: set base path using the logic from AppRouter\n component: () => (\n <SidebarPage>\n <Nav />\n <Content />\n </SidebarPage>\n ),\n });\n },\n});\n","/*\n * Copyright 2020 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// @ts-check\n// NOTE: This file is intentionally .jsx, so that there is one file in this repo where we make sure .jsx files work.\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles({\n svg: {\n width: 'auto',\n height: 28,\n },\n path: {\n fill: '#7df3e1',\n },\n});\n\nconst LogoIcon = () => {\n const classes = useStyles();\n\n return (\n <svg\n className={classes.svg}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 337.46 428.5\"\n >\n <path\n className={classes.path}\n d=\"M303,166.05a80.69,80.69,0,0,0,13.45-10.37c.79-.77,1.55-1.53,2.3-2.3a83.12,83.12,0,0,0,7.93-9.38A63.69,63.69,0,0,0,333,133.23a48.58,48.58,0,0,0,4.35-16.4c1.49-19.39-10-38.67-35.62-54.22L198.56,0,78.3,115.23,0,190.25l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.22,49.22,0,0,0-6.8-8.87A89.17,89.17,0,0,0,259,178.29h.15a85.08,85.08,0,0,0,31-5.79A80.88,80.88,0,0,0,303,166.05ZM202.45,225.86c-19.32,18.51-50.4,21.23-75.7,5.9L51.61,186.15l67.45-64.64,76.41,46.38C223,184.58,221.49,207.61,202.45,225.86Zm8.93-82.22-70.65-42.89L205.14,39,274.51,81.1c25.94,15.72,29.31,37,10.55,55A60.69,60.69,0,0,1,211.38,143.64Zm29.86,190c-19.57,18.75-46.17,29.09-74.88,29.09a123.73,123.73,0,0,1-64.1-18.2L0,282.52v24.67L108.6,373.1a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.27,87.27,0,0,1,241.24,333.68Zm0-39c-19.57,18.75-46.17,29.08-74.88,29.08a123.81,123.81,0,0,1-64.1-18.19L0,243.53v24.68l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.5v-1.78A87.27,87.27,0,0,1,241.24,294.7Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.81,123.81,0,0,1-64.1-18.19L0,204.55v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.82A86.09,86.09,0,0,1,241.24,255.71Zm83.7,25.74a94.15,94.15,0,0,1-60.2,25.86h0V334a81.6,81.6,0,0,0,51.74-22.37c14-13.38,21.14-28.11,21-42.64v-2.19A94.92,94.92,0,0,1,324.94,281.45Zm-83.7,91.21c-19.57,18.76-46.17,29.09-74.88,29.09a123.73,123.73,0,0,1-64.1-18.2L0,321.5v24.68l108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A86.29,86.29,0,0,1,241.24,372.66ZM327,162.45c-.68.69-1.35,1.38-2.05,2.06a94.37,94.37,0,0,1-10.64,8.65,91.35,91.35,0,0,1-11.6,7,94.53,94.53,0,0,1-26.24,8.71,97.69,97.69,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a53.27,53.27,0,0,1,1.14,12V217h.05a84.41,84.41,0,0,0,25.35-5.55,81,81,0,0,0,26.39-16.82c.8-.77,1.5-1.56,2.26-2.34a82.08,82.08,0,0,0,7.93-9.38A63.76,63.76,0,0,0,333,172.17a48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7V150q-1.08,1.54-2.25,3.09A96.73,96.73,0,0,1,327,162.45Zm0,77.92c-.69.7-1.31,1.41-2,2.1a94.2,94.2,0,0,1-60.2,25.86h0l0,26.67h0a81.6,81.6,0,0,0,51.74-22.37A73.51,73.51,0,0,0,333,250.13a48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.47.19-3.71v-2.19c-.74,1.07-1.46,2.15-2.27,3.21A95.68,95.68,0,0,1,327,240.37Zm0-39c-.69.7-1.31,1.41-2,2.1a93.18,93.18,0,0,1-10.63,8.65,91.63,91.63,0,0,1-11.63,7,95.47,95.47,0,0,1-37.94,10.18h0V256h0a81.65,81.65,0,0,0,51.74-22.37c.8-.77,1.5-1.56,2.26-2.34a82.08,82.08,0,0,0,7.93-9.38A63.76,63.76,0,0,0,333,211.15a48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.46,2.16-2.27,3.22A95.68,95.68,0,0,1,327,201.39Z\"\n />\n </svg>\n );\n};\n\nexport default LogoIcon;\n","/*\n * Copyright 2020 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 from 'react';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles({\n svg: {\n width: 'auto',\n height: 30,\n },\n path: {\n fill: '#7df3e1',\n },\n});\nconst LogoFull = () => {\n const classes = useStyles();\n\n return (\n <svg\n className={classes.svg}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 2079.95 456.05\"\n >\n <path\n className={classes.path}\n d=\"M302.9,180a80.62,80.62,0,0,0,13.44-10.37c.8-.77,1.55-1.54,2.31-2.31a81.89,81.89,0,0,0,7.92-9.37,62.37,62.37,0,0,0,6.27-10.77,48.6,48.6,0,0,0,4.36-16.4c1.49-19.39-10-38.67-35.62-54.22L198.42,14,78.16,129.22l-78.29,75,108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.69,49.69,0,0,0-6.8-8.87,89.78,89.78,0,0,0,19.28,2.15H259a85.09,85.09,0,0,0,31-5.79A80.88,80.88,0,0,0,302.9,180Zm-100.59,59.8c-19.32,18.51-50.4,21.24-75.7,5.9l-75.13-45.6,67.44-64.65,76.42,46.39C222.88,198.57,221.36,221.6,202.31,239.84Zm8.94-82.21L140.6,114.74,205,53l69.37,42.11c25.94,15.73,29.31,37.05,10.55,55A60.71,60.71,0,0,1,211.25,157.63Zm29.86,190c-19.57,18.75-46.17,29.08-74.88,29.08a123.84,123.84,0,0,1-64.11-18.19L-.13,296.51v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.85,87.85,0,0,1,241.11,347.67Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,257.52V282.2l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.79A86.86,86.86,0,0,1,241.11,308.68Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,218.54v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.12,19.68-41.49v-1.82A87.14,87.14,0,0,1,241.11,269.7Zm83.69,25.74a94.16,94.16,0,0,1-60.19,25.86h0V348a81.6,81.6,0,0,0,51.73-22.37c14-13.38,21.15-28.11,21-42.64v-2.2A95.14,95.14,0,0,1,324.8,295.44Zm-83.69,91.21c-19.57,18.75-46.17,29.09-74.88,29.09a123.76,123.76,0,0,1-64.11-18.2L-.13,335.49v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.35,87.35,0,0,1,241.11,386.65Zm85.75-210.21c-.68.69-1.35,1.38-2.06,2.05a99.19,99.19,0,0,1-22.23,15.69,94.53,94.53,0,0,1-26.24,8.71,97.84,97.84,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a52.7,52.7,0,0,1,1.13,12V231h.05A84.48,84.48,0,0,0,290,225.47a80.83,80.83,0,0,0,26.38-16.82c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,62.85,62.85,0,0,0,6.29-10.78,48.5,48.5,0,0,0,4.32-16.44c.09-1.23.2-2.47.19-3.7v-2c-.72,1-1.48,2.06-2.26,3.09A98,98,0,0,1,326.86,176.44Zm0,77.92c-.68.7-1.3,1.41-2,2.1a94.09,94.09,0,0,1-60.19,25.85h0V309h0a81.65,81.65,0,0,0,51.73-22.37,73.51,73.51,0,0,0,16.48-22.49,48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A95.81,95.81,0,0,1,326.82,254.36Zm0-39c-.68.7-1.3,1.41-2,2.1a92.22,92.22,0,0,1-10.62,8.65,93.53,93.53,0,0,1-11.63,7,95.63,95.63,0,0,1-37.94,10.18h-.05l0,26.67h0a81.63,81.63,0,0,0,51.73-22.37c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,63.16,63.16,0,0,0,6.29-10.77,48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A98.19,98.19,0,0,1,326.82,215.38Zm241-88.84q7.94,0,17.09.17t18.12,1a139.3,139.3,0,0,1,16.74,2.57,42.78,42.78,0,0,1,13.3,5.14,64.27,64.27,0,0,1,20.54,19.89Q662,168,662,186.54q0,19.54-9.49,33.78t-27.1,21.09v.68q22.78,4.82,34.87,20.58t12.08,38.4a72.62,72.62,0,0,1-4.83,26.06,65.29,65.29,0,0,1-14.33,22.46,71.57,71.57,0,0,1-23.47,15.78q-14,6-32.28,6H478.38V126.54Zm9,105.27q28,0,40.21-9.78t12.26-29.31q0-13-4.14-20.58a29.47,29.47,0,0,0-11.4-11.66A45,45,0,0,0,597,155.17a161.2,161.2,0,0,0-20.19-1.2h-65.6v77.84Zm16.57,112.13q21.74,0,34-11.66T639.59,300q0-12-4.48-19.88a34.85,34.85,0,0,0-11.91-12.52,50.14,50.14,0,0,0-17.09-6.52,105,105,0,0,0-20-1.88H511.17v84.7Zm274.79,26.74q-7.61,4.45-21.06,4.46-11.4,0-18.12-6.34t-6.74-20.75a70.17,70.17,0,0,1-28.13,20.75,97.87,97.87,0,0,1-57.65,3.6,53.51,53.51,0,0,1-18.82-8.58A41.19,41.19,0,0,1,705,348.56q-4.65-9.42-4.66-22.8,0-15.09,5.18-24.69a44.92,44.92,0,0,1,13.64-15.6,62.63,62.63,0,0,1,19.33-9.09q10.88-3.08,22.27-5.14,12.08-2.4,23-3.6a128,128,0,0,0,19.16-3.43c5.53-1.48,9.89-3.65,13.12-6.51s4.83-7,4.83-12.52q0-9.6-3.62-15.43a24.94,24.94,0,0,0-9.32-8.92,38.38,38.38,0,0,0-12.78-4.11,96.54,96.54,0,0,0-14-1q-18.63,0-31.07,7T736.6,249.29H707.26q.69-16.46,6.9-27.77a52.21,52.21,0,0,1,16.57-18.35,70,70,0,0,1,23.65-10.11A125.51,125.51,0,0,1,782.86,190a168.63,168.63,0,0,1,24,1.72,63.26,63.26,0,0,1,21.58,7A41.23,41.23,0,0,1,844,213.59q5.87,9.57,5.87,25v91q0,10.26,1.21,15.05t8.11,4.79a35.57,35.57,0,0,0,9-1.37Zm-47.64-90.87c-3.69,2.74-8.52,4.72-14.5,6s-12.26,2.27-18.82,3.07-13.17,1.71-19.85,2.73a73.7,73.7,0,0,0-18,4.94,32.62,32.62,0,0,0-12.94,9.73q-5,6.32-5,17.23a23.31,23.31,0,0,0,2.94,12.11,24.11,24.11,0,0,0,7.59,8,32,32,0,0,0,10.88,4.44,60.94,60.94,0,0,0,13.11,1.36q14.5,0,24.86-3.92a52.49,52.49,0,0,0,16.91-9.9,39.1,39.1,0,0,0,9.67-13,32.53,32.53,0,0,0,3.11-13.14ZM1002.07,225q-11.05-9.25-29.69-9.26-15.89,0-26.58,5.83A47.29,47.29,0,0,0,928.71,237a64.66,64.66,0,0,0-9.15,22.12A119.83,119.83,0,0,0,916.8,285a98.22,98.22,0,0,0,2.93,24,64.18,64.18,0,0,0,9.15,20.74,46.2,46.2,0,0,0,16.23,14.58q10,5.49,23.82,5.48,21.75,0,34-11.31t15-31.89h30q-4.83,32.91-24.68,50.75t-54,17.83q-20.37,0-36.07-6.52A69.86,69.86,0,0,1,907,350.11a79.92,79.92,0,0,1-15.88-28.63A118.64,118.64,0,0,1,885.73,285a129.41,129.41,0,0,1,5.18-37.21,85.63,85.63,0,0,1,15.71-30.17A73.46,73.46,0,0,1,933,197.35Q948.91,190,970,190a108.54,108.54,0,0,1,28.48,3.6,69.59,69.59,0,0,1,23.48,11.15,61,61,0,0,1,16.74,19q6.55,11.49,8.29,27.26h-30.38Q1013.11,234.21,1002.07,225Zm109.77-98.41v145l81.47-77.49h39.36l-70.77,64.46,75.95,112.82h-37.29l-61.1-92.59-27.62,25.38v67.21H1082.5V126.54Zm170.54,205.22a31.07,31.07,0,0,0,10.87,10.63,49,49,0,0,0,15.19,5.66,87.06,87.06,0,0,0,17.44,1.71,109.18,109.18,0,0,0,14.5-1,53.22,53.22,0,0,0,14-3.78,26.27,26.27,0,0,0,10.53-8q4.14-5.32,4.14-13.55,0-11.31-8.63-17.14a73.69,73.69,0,0,0-21.58-9.43q-12.94-3.6-28.13-6.52a146,146,0,0,1-28.14-8.23A58.16,58.16,0,0,1,1261,267.13q-8.64-9.6-8.63-26.75,0-13.38,6-23a49.26,49.26,0,0,1,15.53-15.61,71.76,71.76,0,0,1,21.4-8.91A99.41,99.41,0,0,1,1319,190a141.31,141.31,0,0,1,28,2.58,64.85,64.85,0,0,1,22.62,8.91,46.16,46.16,0,0,1,15.7,17.15q5.87,10.8,6.91,26.91h-29.35q-.69-8.57-4.48-14.23a29.36,29.36,0,0,0-9.67-9.08,44.16,44.16,0,0,0-12.94-5,67.68,67.68,0,0,0-14.33-1.54,87.29,87.29,0,0,0-13.29,1,45.28,45.28,0,0,0-12.26,3.6,24.49,24.49,0,0,0-9,6.86q-3.46,4.29-3.46,11.14a16.32,16.32,0,0,0,5.36,12.52,42.75,42.75,0,0,0,13.63,8.23,120,120,0,0,0,18.64,5.48q10.37,2.24,20.72,4.63,11,2.4,21.57,5.83A70.74,70.74,0,0,1,1382,284.1a44.55,44.55,0,0,1,13.12,14.23q5,8.58,5,21.26,0,16.13-6.73,26.75a52.5,52.5,0,0,1-17.61,17.14,73.89,73.89,0,0,1-24.51,9.09,146.3,146.3,0,0,1-27.1,2.57,126.24,126.24,0,0,1-28.31-3.09A69.56,69.56,0,0,1,1272,361.94a51.74,51.74,0,0,1-16.57-18.52q-6.21-11.49-6.9-27.95h29.34A32.65,32.65,0,0,0,1282.38,331.76Zm226.46-137.67v25.72h-35.56V329.88a31.37,31.37,0,0,0,.87,8.23,8.42,8.42,0,0,0,3.28,4.8,14.61,14.61,0,0,0,6.73,2.23,99.19,99.19,0,0,0,11.22.51h13.46v25.72H1486.4a105.8,105.8,0,0,1-19.5-1.55,28.65,28.65,0,0,1-13.12-5.65,24.09,24.09,0,0,1-7.42-11.66q-2.43-7.54-2.42-19.89V219.81h-30.38V194.09h30.38V140.94h29.34v53.15ZM1699.4,370.68q-7.61,4.45-21.06,4.46-11.4,0-18.12-6.34t-6.74-20.75a70.17,70.17,0,0,1-28.13,20.75,97.87,97.87,0,0,1-57.65,3.6,53.51,53.51,0,0,1-18.82-8.58,41.19,41.19,0,0,1-12.6-15.26q-4.65-9.42-4.66-22.8,0-15.09,5.18-24.69a44.92,44.92,0,0,1,13.64-15.6,62.63,62.63,0,0,1,19.33-9.09q10.88-3.08,22.27-5.14,12.07-2.4,23-3.6a128,128,0,0,0,19.16-3.43c5.53-1.48,9.89-3.65,13.12-6.51s4.83-7,4.83-12.52q0-9.6-3.62-15.43a24.94,24.94,0,0,0-9.32-8.92,38.38,38.38,0,0,0-12.78-4.11,96.54,96.54,0,0,0-14-1q-18.63,0-31.07,7t-13.46,26.57h-29.34q.67-16.46,6.9-27.77A52.21,52.21,0,0,1,1562,203.17a70,70,0,0,1,23.65-10.11,125.51,125.51,0,0,1,28.48-3.09,168.63,168.63,0,0,1,24,1.72,63.26,63.26,0,0,1,21.58,7,41.23,41.23,0,0,1,15.53,14.89q5.87,9.57,5.87,25v91q0,10.26,1.21,15.05t8.11,4.79a35.57,35.57,0,0,0,9-1.37Zm-47.64-90.87c-3.69,2.74-8.52,4.72-14.5,6s-12.26,2.27-18.82,3.07-13.17,1.71-19.85,2.73a73.7,73.7,0,0,0-17.95,4.94,32.62,32.62,0,0,0-12.94,9.73q-5,6.32-5,17.23a23.31,23.31,0,0,0,2.94,12.11,24.11,24.11,0,0,0,7.59,8,32,32,0,0,0,10.88,4.44,60.94,60.94,0,0,0,13.11,1.36q14.51,0,24.86-3.92a52.49,52.49,0,0,0,16.91-9.9,39.1,39.1,0,0,0,9.67-13,32.53,32.53,0,0,0,3.11-13.14Zm208.85,141.62q-20,21.6-62.83,21.6a122.11,122.11,0,0,1-25.37-2.74,78,78,0,0,1-23.48-8.92,54.41,54.41,0,0,1-17.43-16.11q-6.91-10-7.6-24.35h29.35a21.47,21.47,0,0,0,5,13.38,36.67,36.67,0,0,0,11.4,8.91,55.52,55.52,0,0,0,14.67,5,79.51,79.51,0,0,0,15.19,1.55q14.49,0,24.51-5A46,46,0,0,0,1840.59,401a56.53,56.53,0,0,0,9.49-21.09,117.46,117.46,0,0,0,2.94-27.09V341.19h-.7q-7.59,16.46-23,24.18a71.8,71.8,0,0,1-32.63,7.71q-20,0-34.86-7.2A72.88,72.88,0,0,1,1737,346.51a82.13,82.13,0,0,1-15-28.46,116.62,116.62,0,0,1-5-34.47,133.92,133.92,0,0,1,4.14-32.4A88.17,88.17,0,0,1,1735,221a75.49,75.49,0,0,1,25.55-22.29q15.87-8.75,39-8.75a66.21,66.21,0,0,1,31.07,7.38,52.13,52.13,0,0,1,22.09,22.11h.35V194.09h27.61V356.28Q1880.63,399.83,1860.61,421.43Zm-37.46-79.72a47.94,47.94,0,0,0,16.4-15.78,71.89,71.89,0,0,0,9.15-22.11,106.77,106.77,0,0,0,2.93-24.69,96.71,96.71,0,0,0-2.76-23,64,64,0,0,0-8.8-20.4,45.76,45.76,0,0,0-15.71-14.57q-9.66-5.49-23.47-5.49-14.16,0-24.17,5.32a46.77,46.77,0,0,0-16.4,14.23,60.14,60.14,0,0,0-9.32,20.57,99.69,99.69,0,0,0-2.93,24.35,120.63,120.63,0,0,0,2.42,24,67.5,67.5,0,0,0,8.28,21.77,46.37,46.37,0,0,0,15.54,15.78q9.66,6,24.16,6T1823.15,341.71Zm228,18.34q-20,15.09-50.41,15.09-21.4,0-37.11-6.86a73.16,73.16,0,0,1-26.41-19.2,81.52,81.52,0,0,1-16-29.49,141.12,141.12,0,0,1-6-37.38,106.1,106.1,0,0,1,6.21-37A88.56,88.56,0,0,1,1938.8,216a79.09,79.09,0,0,1,26.58-19.2A81.66,81.66,0,0,1,1999,190q23.82,0,39.53,9.78a78,78,0,0,1,25.2,24.86,98.18,98.18,0,0,1,13.12,32.91,140.6,140.6,0,0,1,2.93,34h-133.6a70,70,0,0,0,2.76,22.12,49.9,49.9,0,0,0,10,18.51A49.1,49.1,0,0,0,1976.6,345q10.7,4.82,25.2,4.8,18.65,0,30.55-8.57t15.71-26.06h29Q2071.18,345,2051.17,360.05Zm-7.08-113.84a50,50,0,0,0-10.7-16,53.1,53.1,0,0,0-56.62-10.63,47.48,47.48,0,0,0-15.71,10.81,51.69,51.69,0,0,0-10.35,15.94,60.18,60.18,0,0,0-4.49,19.37h102.53A59.47,59.47,0,0,0,2044.09,246.21ZM302.9,180a80.62,80.62,0,0,0,13.44-10.37c.8-.77,1.55-1.54,2.31-2.31a81.89,81.89,0,0,0,7.92-9.37,62.37,62.37,0,0,0,6.27-10.77,48.6,48.6,0,0,0,4.36-16.4c1.49-19.39-10-38.67-35.62-54.22L198.42,14,78.16,129.22l-78.29,75,108.6,65.9a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.8,66.42-25.69,19.16-18.36,25.52-42.12,13.7-61.87a49.69,49.69,0,0,0-6.8-8.87,89.78,89.78,0,0,0,19.28,2.15H259a85.09,85.09,0,0,0,31-5.79A80.88,80.88,0,0,0,302.9,180Zm-100.59,59.8c-19.32,18.51-50.4,21.24-75.7,5.9l-75.13-45.6,67.44-64.65,76.42,46.39C222.88,198.57,221.36,221.6,202.31,239.84Zm8.94-82.21L140.6,114.74,205,53l69.37,42.11c25.94,15.73,29.31,37.05,10.55,55A60.71,60.71,0,0,1,211.25,157.63Zm29.86,190c-19.57,18.75-46.17,29.08-74.88,29.08a123.84,123.84,0,0,1-64.11-18.19L-.13,296.51v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.85,87.85,0,0,1,241.11,347.67Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,257.52V282.2l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.68,12.88-12.35,20-27.13,19.68-41.5v-1.79A86.86,86.86,0,0,1,241.11,308.68Zm0-39c-19.57,18.76-46.17,29.09-74.88,29.09a123.84,123.84,0,0,1-64.11-18.19L-.13,218.54v24.68l108.6,65.91a111.59,111.59,0,0,0,57.76,16.41c24.92,0,48.8-8.8,66.42-25.69,12.88-12.34,20-27.12,19.68-41.49v-1.82A87.14,87.14,0,0,1,241.11,269.7Zm83.69,25.74a94.16,94.16,0,0,1-60.19,25.86h0V348a81.6,81.6,0,0,0,51.73-22.37c14-13.38,21.15-28.11,21-42.64v-2.2A95.14,95.14,0,0,1,324.8,295.44Zm-83.69,91.21c-19.57,18.75-46.17,29.09-74.88,29.09a123.76,123.76,0,0,1-64.11-18.2L-.13,335.49v24.67l108.6,65.91a111.6,111.6,0,0,0,57.76,16.42c24.92,0,48.8-8.81,66.42-25.69,12.88-12.34,20-27.13,19.68-41.49v-1.79A87.35,87.35,0,0,1,241.11,386.65Zm85.75-210.21c-.68.69-1.35,1.38-2.06,2.05a99.19,99.19,0,0,1-22.23,15.69,94.53,94.53,0,0,1-26.24,8.71,97.84,97.84,0,0,1-14.16,1.57c.5,1.61.9,3.25,1.25,4.9a52.7,52.7,0,0,1,1.13,12V231h.05A84.48,84.48,0,0,0,290,225.47a80.83,80.83,0,0,0,26.38-16.82c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,62.85,62.85,0,0,0,6.29-10.78,48.5,48.5,0,0,0,4.32-16.44c.09-1.23.2-2.47.19-3.7v-2c-.72,1-1.48,2.06-2.26,3.09A98,98,0,0,1,326.86,176.44Zm0,77.92c-.68.7-1.3,1.41-2,2.1a94.09,94.09,0,0,1-60.19,25.85h0V309h0a81.65,81.65,0,0,0,51.73-22.37,73.51,73.51,0,0,0,16.48-22.49,48.56,48.56,0,0,0,4.32-16.44c.09-1.24.2-2.48.19-3.71v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A95.81,95.81,0,0,1,326.82,254.36Zm0-39c-.68.7-1.3,1.41-2,2.1a92.22,92.22,0,0,1-10.62,8.65,93.53,93.53,0,0,1-11.63,7,95.63,95.63,0,0,1-37.94,10.18h-.05l0,26.67h0a81.63,81.63,0,0,0,51.73-22.37c.81-.77,1.51-1.56,2.27-2.34a82,82,0,0,0,7.92-9.38,63.16,63.16,0,0,0,6.29-10.77,48.55,48.55,0,0,0,4.32-16.45c.09-1.23.2-2.47.19-3.7v-2.2c-.74,1.08-1.47,2.16-2.27,3.22A98.19,98.19,0,0,1,326.82,215.38Z\"\n />\n </svg>\n );\n};\n\nexport default LogoFull;\n","/*\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 React from 'react';\nimport {\n createExtension,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { makeStyles } from '@material-ui/core';\nimport {\n Sidebar,\n useSidebarOpenState,\n Link,\n sidebarConfig,\n SidebarDivider,\n SidebarItem,\n} from '@backstage/core-components';\nimport { GraphiQLIcon } from '@backstage/plugin-graphiql';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport LogoIcon from '../../../app/src/components/Root/LogoIcon';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport LogoFull from '../../../app/src/components/Root/LogoFull';\n\nconst useSidebarLogoStyles = makeStyles({\n root: {\n width: sidebarConfig.drawerWidthClosed,\n height: 3 * sidebarConfig.logoHeight,\n display: 'flex',\n flexFlow: 'row nowrap',\n alignItems: 'center',\n marginBottom: -14,\n },\n link: {\n width: sidebarConfig.drawerWidthClosed,\n marginLeft: 24,\n },\n});\n\nconst SidebarLogo = () => {\n const classes = useSidebarLogoStyles();\n const { isOpen } = useSidebarOpenState();\n\n return (\n <div className={classes.root}>\n <Link to=\"/\" underline=\"none\" className={classes.link} aria-label=\"Home\">\n {isOpen ? <LogoFull /> : <LogoIcon />}\n </Link>\n </div>\n );\n};\n\nexport const CoreNav = createExtension({\n id: 'core.nav',\n at: 'core.layout/nav',\n inputs: {},\n output: {\n component: coreExtensionData.reactComponent,\n },\n factory({ bind }) {\n bind({\n // TODO: set base path using the logic from AppRouter\n component: () => (\n <Sidebar>\n <SidebarLogo />\n <SidebarDivider />\n <SidebarItem icon={GraphiQLIcon} to=\"graphiql\" text=\"GraphiQL\" />\n </Sidebar>\n ),\n });\n },\n});\n","/*\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 BackstagePlugin,\n Extension,\n ExtensionDataRef,\n} from '@backstage/frontend-plugin-api';\nimport mapValues from 'lodash/mapValues';\n\n/** @internal */\nexport interface ExtensionInstance {\n readonly $$type: '@backstage/ExtensionInstance';\n\n readonly id: string;\n /**\n * Get concrete value for the given extension data reference. Returns undefined if no value is available.\n */\n getData<T>(ref: ExtensionDataRef<T>): T | undefined;\n /**\n * Maps input names to the actual instances given to them.\n */\n readonly attachments: Map<string, ExtensionInstance[]>;\n}\n\n/** @internal */\nexport function createExtensionInstance(options: {\n extension: Extension<unknown>;\n config: unknown;\n source?: BackstagePlugin;\n attachments: Map<string, ExtensionInstance[]>;\n}): ExtensionInstance {\n const { extension, config, source, attachments } = options;\n const extensionData = new Map<string, unknown>();\n\n let parsedConfig: unknown;\n try {\n parsedConfig = extension.configSchema?.parse(config ?? {});\n } catch (e) {\n throw new Error(\n `Invalid configuration for extension instance '${extension.id}', ${e}`,\n );\n }\n\n try {\n extension.factory({\n source,\n config: parsedConfig,\n bind: namedOutputs => {\n for (const [name, output] of Object.entries(namedOutputs)) {\n const ref = extension.output[name];\n if (!ref) {\n throw new Error(\n `Extension instance '${extension.id}' tried to bind unknown output '${name}'`,\n );\n }\n extensionData.set(ref.id, output);\n }\n },\n inputs: mapValues(\n extension.inputs,\n ({ extensionData: pointData }, inputName) => {\n // TODO: validation\n return (attachments.get(inputName) ?? []).map(attachment =>\n mapValues(pointData, ref => attachment.getData(ref)),\n );\n },\n ),\n });\n } catch (e) {\n throw new Error(\n `Failed to instantiate extension instance '${extension.id}', ${e}`,\n );\n }\n\n return {\n $$type: '@backstage/ExtensionInstance',\n id: options.extension.id,\n getData<T>(ref: ExtensionDataRef<T>): T | undefined {\n return extensionData.get(ref.id) as T | undefined;\n },\n\n attachments,\n };\n}\n","/*\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 { Config } from '@backstage/config';\nimport { BackstagePlugin, Extension } from '@backstage/frontend-plugin-api';\nimport { JsonValue } from '@backstage/types';\n\nexport interface ExtensionParameters {\n id: string;\n at?: string;\n disabled?: boolean;\n config?: unknown;\n}\n\nconst knownExtensionParameters = ['at', 'disabled', 'config'];\n\n// Since we'll never merge arrays in config the config reader context\n// isn't too much of a help. Fall back to manual config reading logic\n// as the Config interface makes it quite hard for us otherwise.\n/** @internal */\nexport function readAppExtensionParameters(\n rootConfig: Config,\n): ExtensionParameters[] {\n const arr = rootConfig.getOptional('app.extensions');\n if (!Array.isArray(arr)) {\n if (arr === undefined) {\n return [];\n }\n // This will throw, and show which part of config had the wrong type\n rootConfig.getConfigArray('app.extensions');\n return [];\n }\n\n return arr.map((arrayEntry, arrayIndex) =>\n expandShorthandExtensionParameters(arrayEntry, arrayIndex),\n );\n}\n\n/** @internal */\nexport function expandShorthandExtensionParameters(\n arrayEntry: JsonValue,\n arrayIndex: number,\n): ExtensionParameters {\n function errorMsg(msg: string, key?: string, prop?: string) {\n return `Invalid extension configuration at app.extensions[${arrayIndex}]${\n key ? `[${key}]` : ''\n }${prop ? `.${prop}` : ''}, ${msg}`;\n }\n\n // NOTE(freben): This check is intentionally not complete and doesn't check\n // whether letters and digits are used, etc. It's not up to the config reading\n // logic to decide what constitutes a valid extension ID; that should be\n // decided by the logic that loads and instantiates the extensions. This check\n // is just here to catch real mistakes or truly conceptually wrong input.\n function assertValidId(id: string) {\n if (!id || id !== id.trim()) {\n throw new Error(\n errorMsg('extension ID must not be empty or contain whitespace'),\n );\n }\n\n if (id.includes('/')) {\n let message = `extension ID must not contain slashes; got '${id}'`;\n const good = id.split('/')[0];\n if (good) {\n message += `, did you mean '${good}'?`;\n }\n throw new Error(errorMsg(message));\n }\n }\n\n // Example YAML:\n // - entity.card.about\n if (typeof arrayEntry === 'string') {\n assertValidId(arrayEntry);\n return {\n id: arrayEntry,\n disabled: false,\n };\n }\n\n // All remaining cases are single-key objects\n if (\n typeof arrayEntry !== 'object' ||\n arrayEntry === null ||\n Array.isArray(arrayEntry)\n ) {\n throw new Error(errorMsg('must be a string or an object'));\n }\n const keys = Object.keys(arrayEntry);\n if (keys.length !== 1) {\n const joinedKeys = keys.length ? `'${keys.join(\"', '\")}'` : 'none';\n throw new Error(errorMsg(`must have exactly one key, got ${joinedKeys}`));\n }\n\n const id = String(keys[0]);\n const value = arrayEntry[id];\n assertValidId(id);\n\n // This example covers a potentially common mistake in the syntax\n // Example YAML:\n // - entity.card.about:\n if (value === null) {\n return {\n id,\n disabled: false,\n };\n }\n\n // Example YAML:\n // - catalog.page.cicd: false\n if (typeof value === 'boolean') {\n return {\n id,\n disabled: !value,\n };\n }\n\n // The remaining case is the generic object. Example YAML:\n // - tech-radar.page:\n // at: core.router/routes\n // disabled: false\n // config:\n // path: /tech-radar\n // width: 1500\n // height: 800\n if (typeof value !== 'object' || Array.isArray(value)) {\n // We don't mention null here - we don't want people to explicitly enter\n // - entity.card.about: null\n throw new Error(errorMsg('value must be a boolean or object', id));\n }\n\n const at = value.at;\n const disabled = value.disabled;\n const config = value.config;\n\n if (at !== undefined && typeof at !== 'string') {\n throw new Error(errorMsg('must be a string', id, 'at'));\n } else if (disabled !== undefined && typeof disabled !== 'boolean') {\n throw new Error(errorMsg('must be a boolean', id, 'disabled'));\n } else if (\n config !== undefined &&\n (typeof config !== 'object' || config === null || Array.isArray(config))\n ) {\n throw new Error(errorMsg('must be an object', id, 'config'));\n }\n\n const unknownKeys = Object.keys(value).filter(\n k => !knownExtensionParameters.includes(k),\n );\n if (unknownKeys.length > 0) {\n throw new Error(\n errorMsg(\n `unknown parameter; expected one of '${knownExtensionParameters.join(\n \"', '\",\n )}'`,\n id,\n unknownKeys.join(', '),\n ),\n );\n }\n\n return {\n id,\n at,\n disabled,\n config,\n };\n}\n\nexport interface ExtensionInstanceParameters {\n extension: Extension<unknown>;\n source?: BackstagePlugin;\n at: string;\n config?: unknown;\n}\n\n/** @internal */\nexport function mergeExtensionParameters(options: {\n sources: BackstagePlugin[];\n builtinExtensions: Extension<unknown>[];\n parameters: Array<ExtensionParameters>;\n}): ExtensionInstanceParameters[] {\n const { sources, builtinExtensions, parameters } = options;\n\n const overrides = [\n ...sources.flatMap(plugin =>\n plugin.extensions.map(extension => ({\n extension,\n params: {\n source: plugin,\n at: extension.at,\n disabled: extension.disabled,\n config: undefined as unknown,\n },\n })),\n ),\n ...builtinExtensions.map(extension => ({\n extension,\n params: {\n source: undefined,\n at: extension.at,\n disabled: extension.disabled,\n config: undefined as unknown,\n },\n })),\n ];\n\n for (const overrideParam of parameters) {\n const existingIndex = overrides.findIndex(\n e => e.extension.id === overrideParam.id,\n );\n if (existingIndex !== -1) {\n const existing = overrides[existingIndex];\n if (overrideParam.at) {\n existing.params.at = overrideParam.at;\n }\n if (overrideParam.config) {\n // TODO: merge config?\n existing.params.config = overrideParam.config;\n }\n if (\n Boolean(existing.params.disabled) !== Boolean(overrideParam.disabled)\n ) {\n existing.params.disabled = Boolean(overrideParam.disabled);\n if (!existing.params.disabled) {\n // bump\n overrides.splice(existingIndex, 1);\n overrides.push(existing);\n }\n }\n } else {\n throw new Error(`Extension ${overrideParam.id} does not exist`);\n }\n }\n\n return overrides\n .filter(override => !override.params.disabled)\n .map(param => ({\n extension: param.extension,\n at: param.params.at,\n source: param.params.source,\n config: param.params.config,\n }));\n}\n","/*\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 { RouteRef } from '@backstage/core-plugin-api';\nimport React, { createContext, ReactNode } from 'react';\n\nexport interface RoutingContextType {\n resolve(\n routeRef: RouteRef,\n options: { pathname: string },\n ): (() => string) | undefined;\n}\n\nexport const RoutingContext = createContext<RoutingContextType>({\n resolve: () => () => '',\n});\n\nexport class RouteResolver {\n constructor(private readonly routePaths: Map<RouteRef, string>) {}\n\n resolve(anyRouteRef: RouteRef<{}>): (() => string) | undefined {\n const basePath = this.routePaths.get(anyRouteRef);\n if (!basePath) {\n return undefined;\n }\n return () => basePath;\n }\n}\n\nexport function RoutingProvider(props: {\n routePaths: Map<RouteRef, string>;\n children?: ReactNode;\n}) {\n return (\n <RoutingContext.Provider value={new RouteResolver(props.routePaths)}>\n {props.children}\n </RoutingContext.Provider>\n );\n}\n","/*\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 { BackstagePlugin } from '@backstage/frontend-plugin-api';\n\ninterface DiscoveryGlobal {\n modules: Array<{ name: string; default: unknown }>;\n}\n\n/**\n * @public\n */\nexport function getAvailablePlugins(): BackstagePlugin[] {\n const discovered = (\n window as { '__@backstage/discovered__'?: DiscoveryGlobal }\n )['__@backstage/discovered__'];\n\n return (\n discovered?.modules.map(m => m.default).filter(isBackstagePlugin) ?? []\n );\n}\n\nfunction isBackstagePlugin(obj: unknown): obj is BackstagePlugin {\n if (obj !== null && typeof obj === 'object' && '$$type' in obj) {\n return obj.$$type === '@backstage/BackstagePlugin';\n }\n return false;\n}\n","/*\n * Copyright 2020 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, { useMemo, useEffect, useState, PropsWithChildren } from 'react';\nimport { useApi, appThemeApiRef, AppTheme } from '@backstage/core-plugin-api';\nimport useObservable from 'react-use/lib/useObservable';\n\n// This tries to find the most accurate match, but also falls back to less\n// accurate results in order to avoid errors.\nfunction resolveTheme(\n themeId: string | undefined,\n shouldPreferDark: boolean,\n themes: AppTheme[],\n) {\n if (themeId !== undefined) {\n const selectedTheme = themes.find(theme => theme.id === themeId);\n if (selectedTheme) {\n return selectedTheme;\n }\n }\n\n if (shouldPreferDark) {\n const darkTheme = themes.find(theme => theme.variant === 'dark');\n if (darkTheme) {\n return darkTheme;\n }\n }\n\n const lightTheme = themes.find(theme => theme.variant === 'light');\n if (lightTheme) {\n return lightTheme;\n }\n\n return themes[0];\n}\n\nconst useShouldPreferDarkTheme = () => {\n const mediaQuery = useMemo(\n () => window.matchMedia('(prefers-color-scheme: dark)'),\n [],\n );\n const [shouldPreferDark, setPrefersDark] = useState(mediaQuery.matches);\n\n useEffect(() => {\n const listener = (event: MediaQueryListEvent) => {\n setPrefersDark(event.matches);\n };\n mediaQuery.addListener(listener);\n return () => {\n mediaQuery.removeListener(listener);\n };\n }, [mediaQuery]);\n\n return shouldPreferDark;\n};\n\nexport function AppThemeProvider({ children }: PropsWithChildren<{}>) {\n const appThemeApi = useApi(appThemeApiRef);\n const themeId = useObservable(\n appThemeApi.activeThemeId$(),\n appThemeApi.getActiveThemeId(),\n );\n\n // Browser feature detection won't change over time, so ignore lint rule\n const shouldPreferDark = Boolean(window.matchMedia)\n ? useShouldPreferDarkTheme() // eslint-disable-line react-hooks/rules-of-hooks\n : false;\n\n const appTheme = resolveTheme(\n themeId,\n shouldPreferDark,\n appThemeApi.getInstalledThemes(),\n );\n if (!appTheme) {\n throw new Error('App has no themes');\n }\n\n return <appTheme.Provider children={children} />;\n}\n","/*\n * Copyright 2020 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, { PropsWithChildren } from 'react';\nimport {\n createVersionedValueMap,\n createVersionedContext,\n} from '@backstage/version-bridge';\nimport { AppContext as AppContextV1 } from './types';\n\nconst AppContext = createVersionedContext<{ 1: AppContextV1 }>('app-context');\n\ntype Props = {\n appContext: AppContextV1;\n};\n\nexport const AppContextProvider = ({\n appContext,\n children,\n}: PropsWithChildren<Props>) => {\n const versionedValue = createVersionedValueMap({ 1: appContext });\n\n return <AppContext.Provider value={versionedValue} children={children} />;\n};\n","/*\n * Copyright 2020 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 FeatureFlagState,\n FeatureFlagsApi,\n FeatureFlag,\n FeatureFlagsSaveOptions,\n} from '@backstage/core-plugin-api';\n\nexport function validateFlagName(name: string): void {\n if (name.length < 3) {\n throw new Error(\n `The '${name}' feature flag must have a minimum length of three characters.`,\n );\n }\n\n if (name.length > 150) {\n throw new Error(\n `The '${name}' feature flag must not exceed 150 characters.`,\n );\n }\n\n if (!name.match(/^[a-z]+[a-z0-9-]+$/)) {\n throw new Error(\n `The '${name}' feature flag must start with a lowercase letter and only contain lowercase letters, numbers and hyphens. ` +\n 'Examples: feature-flag-one, alpha, release-2020',\n );\n }\n}\n\n/**\n * A feature flags implementation that stores the flags in the browser's local\n * storage.\n *\n * @public\n */\nexport class LocalStorageFeatureFlags implements FeatureFlagsApi {\n private registeredFeatureFlags: FeatureFlag[] = [];\n private flags?: Map<string, FeatureFlagState>;\n\n registerFlag(flag: FeatureFlag) {\n validateFlagName(flag.name);\n this.registeredFeatureFlags.push(flag);\n }\n\n getRegisteredFlags(): FeatureFlag[] {\n return this.registeredFeatureFlags.slice();\n }\n\n isActive(name: string): boolean {\n if (!this.flags) {\n this.flags = this.load();\n }\n return this.flags.get(name) === FeatureFlagState.Active;\n }\n\n save(options: FeatureFlagsSaveOptions): void {\n if (!this.flags) {\n this.flags = this.load();\n }\n if (!options.merge) {\n this.flags.clear();\n }\n for (const [name, state] of Object.entries(options.states)) {\n this.flags.set(name, state);\n }\n\n const enabled = Array.from(this.flags.entries()).filter(\n ([, state]) => state === FeatureFlagState.Active,\n );\n window.localStorage.setItem(\n 'featureFlags',\n JSON.stringify(Object.fromEntries(enabled)),\n );\n }\n\n private load(): Map<string, FeatureFlagState> {\n try {\n const jsonStr = window.localStorage.getItem('featureFlags');\n if (!jsonStr) {\n return new Map();\n }\n const json = JSON.parse(jsonStr) as unknown;\n if (typeof json !== 'object' || json === null || Array.isArray(json)) {\n return new Map();\n }\n\n const entries = Object.entries(json).filter(([name, value]) => {\n validateFlagName(name);\n return value === FeatureFlagState.Active;\n });\n\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n}\n","/*\n * Copyright 2020 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 { AppConfig } from '@backstage/config';\nimport { JsonObject } from '@backstage/types';\nimport { AppConfigLoader } from './types';\n\n/**\n * The default config loader, which expects that config is available at compile-time\n * in `process.env.APP_CONFIG`. APP_CONFIG should be an array of config objects as\n * returned by the config loader.\n *\n * It will also load runtime config from the __APP_INJECTED_RUNTIME_CONFIG__ string,\n * which can be rewritten at runtime to contain an additional JSON config object.\n * If runtime config is present, it will be placed first in the config array, overriding\n * other config values.\n *\n * @public\n */\nexport const defaultConfigLoader: AppConfigLoader = async () =>\n defaultConfigLoaderSync();\n\n/** @internal */\nexport function defaultConfigLoaderSync(\n // This string may be replaced at runtime to provide additional config.\n // It should be replaced by a JSON-serialized config object.\n // It's a param so we can test it, but at runtime this will always fall back to default.\n runtimeConfigJson: string = '__APP_INJECTED_RUNTIME_CONFIG__',\n) {\n const appConfig = process.env.APP_CONFIG;\n if (!appConfig) {\n throw new Error('No static configuration provided');\n }\n if (!Array.isArray(appConfig)) {\n throw new Error('Static configuration has invalid format');\n }\n const configs = appConfig.slice() as unknown as AppConfig[];\n\n // Avoiding this string also being replaced at runtime\n if (\n runtimeConfigJson !==\n '__app_injected_runtime_config__'.toLocaleUpperCase('en-US')\n ) {\n try {\n const data = JSON.parse(runtimeConfigJson) as JsonObject;\n if (Array.isArray(data)) {\n configs.push(...data);\n } else {\n configs.push({ data, context: 'env' });\n }\n } catch (error) {\n throw new Error(`Failed to load runtime configuration, ${error}`);\n }\n }\n\n const windowAppConfig = (window as any).__APP_CONFIG__;\n if (windowAppConfig) {\n configs.push({\n context: 'window',\n data: windowAppConfig,\n });\n }\n return configs;\n}\n","/*\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 { AppConfig, ConfigReader } from '@backstage/config';\n\n/**\n * Creates a base URL that uses to the current document origin.\n */\nfunction createLocalBaseUrl(fullUrl: string): string {\n const url = new URL(fullUrl);\n url.protocol = document.location.protocol;\n url.hostname = document.location.hostname;\n url.port = document.location.port;\n return url.toString().replace(/\\/$/, '');\n}\n\n/**\n * If we are able to override the app and backend base URLs to values that\n * match the origin of the current location, then this function returns a\n * new array of app configs that contain the overrides.\n *\n * @internal\n */\nexport function overrideBaseUrlConfigs(inputConfigs: AppConfig[]): AppConfig[] {\n const urlConfigReader = ConfigReader.fromConfigs(inputConfigs);\n\n // In tests we may not have `app.baseUrl` or `backend.baseUrl`, to keep them optional\n const appBaseUrl = urlConfigReader.getOptionalString('app.baseUrl');\n const backendBaseUrl = urlConfigReader.getOptionalString('backend.baseUrl');\n\n let configs = inputConfigs;\n\n let newBackendBaseUrl: string | undefined = undefined;\n let newAppBaseUrl: string | undefined = undefined;\n\n if (appBaseUrl && backendBaseUrl) {\n const appOrigin = new URL(appBaseUrl).origin;\n const backendOrigin = new URL(backendBaseUrl).origin;\n\n if (appOrigin === backendOrigin) {\n const maybeNewBackendBaseUrl = createLocalBaseUrl(backendBaseUrl);\n if (backendBaseUrl !== maybeNewBackendBaseUrl) {\n newBackendBaseUrl = maybeNewBackendBaseUrl;\n }\n }\n }\n\n if (appBaseUrl) {\n const maybeNewAppBaseUrl = createLocalBaseUrl(appBaseUrl);\n if (appBaseUrl !== maybeNewAppBaseUrl) {\n newAppBaseUrl = maybeNewAppBaseUrl;\n }\n }\n\n // Only add the relative config if there is actually data to add.\n if (newAppBaseUrl || newBackendBaseUrl) {\n configs = configs.concat({\n data: {\n app: newAppBaseUrl && {\n baseUrl: newAppBaseUrl,\n },\n backend: newBackendBaseUrl && {\n baseUrl: newBackendBaseUrl,\n },\n },\n context: 'relative-resolver',\n });\n }\n\n return configs;\n}\n","/*\n * Copyright 2020 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 AlertApiForwarder,\n NoOpAnalyticsApi,\n ErrorApiForwarder,\n ErrorAlerter,\n GoogleAuth,\n GithubAuth,\n OktaAuth,\n GitlabAuth,\n MicrosoftAuth,\n BitbucketAuth,\n BitbucketServerAuth,\n OAuthRequestManager,\n WebStorage,\n UrlPatternDiscovery,\n OneLoginAuth,\n UnhandledErrorForwarder,\n AtlassianAuth,\n createFetchApi,\n FetchMiddlewares,\n} from '@backstage/core-app-api';\n\nimport {\n createApiFactory,\n alertApiRef,\n analyticsApiRef,\n errorApiRef,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n oauthRequestApiRef,\n googleAuthApiRef,\n githubAuthApiRef,\n oktaAuthApiRef,\n gitlabAuthApiRef,\n microsoftAuthApiRef,\n storageApiRef,\n configApiRef,\n oneloginAuthApiRef,\n bitbucketAuthApiRef,\n bitbucketServerAuthApiRef,\n atlassianAuthApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n permissionApiRef,\n IdentityPermissionApi,\n} from '@backstage/plugin-permission-react';\n\nexport const apis = [\n createApiFactory({\n api: discoveryApiRef,\n deps: { configApi: configApiRef },\n factory: ({ configApi }) =>\n UrlPatternDiscovery.compile(\n `${configApi.getString('backend.baseUrl')}/api/{{ pluginId }}`,\n ),\n }),\n createApiFactory({\n api: alertApiRef,\n deps: {},\n factory: () => new AlertApiForwarder(),\n }),\n createApiFactory({\n api: analyticsApiRef,\n deps: {},\n factory: () => new NoOpAnalyticsApi(),\n }),\n createApiFactory({\n api: errorApiRef,\n deps: { alertApi: alertApiRef },\n factory: ({ alertApi }) => {\n const errorApi = new ErrorAlerter(alertApi, new ErrorApiForwarder());\n UnhandledErrorForwarder.forward(errorApi, { hidden: false });\n return errorApi;\n },\n }),\n createApiFactory({\n api: storageApiRef,\n deps: { errorApi: errorApiRef },\n factory: ({ errorApi }) => WebStorage.create({ errorApi }),\n }),\n createApiFactory({\n api: fetchApiRef,\n deps: {\n configApi: configApiRef,\n identityApi: identityApiRef,\n discoveryApi: discoveryApiRef,\n },\n factory: ({ configApi, identityApi, discoveryApi }) => {\n return createFetchApi({\n middleware: [\n FetchMiddlewares.resolvePluginProtocol({\n discoveryApi,\n }),\n FetchMiddlewares.injectIdentityAuth({\n identityApi,\n config: configApi,\n }),\n ],\n });\n },\n }),\n createApiFactory({\n api: oauthRequestApiRef,\n deps: {},\n factory: () => new OAuthRequestManager(),\n }),\n createApiFactory({\n api: googleAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n GoogleAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: microsoftAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n MicrosoftAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: githubAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n GithubAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n defaultScopes: ['read:user'],\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: oktaAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n OktaAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: gitlabAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n GitlabAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: oneloginAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n OneLoginAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: bitbucketAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n BitbucketAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n defaultScopes: ['team'],\n environment: configApi.getOptionalString('auth.environment'),\n }),\n }),\n createApiFactory({\n api: bitbucketServerAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) =>\n BitbucketServerAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n defaultScopes: ['REPO_READ'],\n }),\n }),\n createApiFactory({\n api: atlassianAuthApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n oauthRequestApi: oauthRequestApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, oauthRequestApi, configApi }) => {\n return AtlassianAuth.create({\n configApi,\n discoveryApi,\n oauthRequestApi,\n environment: configApi.getOptionalString('auth.environment'),\n });\n },\n }),\n createApiFactory({\n api: permissionApiRef,\n deps: {\n discovery: discoveryApiRef,\n identity: identityApiRef,\n config: configApiRef,\n },\n factory: ({ config, discovery, identity }) =>\n IdentityPermissionApi.create({ config, discovery, identity }),\n }),\n];\n","/*\n * Copyright 2021 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, { ReactNode } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { ErrorPanel, Progress, ErrorPage } from '@backstage/core-components';\nimport {\n MemoryRouter,\n useInRouterContext,\n BrowserRouter,\n} from 'react-router-dom';\nimport {\n AppComponents,\n BootErrorPageProps,\n ErrorBoundaryFallbackProps,\n} from '@backstage/core-plugin-api';\n\nexport function OptionallyWrapInRouter({ children }: { children: ReactNode }) {\n if (useInRouterContext()) {\n return <>{children}</>;\n }\n return <MemoryRouter>{children}</MemoryRouter>;\n}\n\nconst DefaultNotFoundPage = () => (\n <ErrorPage status=\"404\" statusMessage=\"PAGE NOT FOUND\" />\n);\n\nconst DefaultBootErrorPage = ({ step, error }: BootErrorPageProps) => {\n let message = '';\n if (step === 'load-config') {\n message = `The configuration failed to load, someone should have a look at this error: ${error.message}`;\n } else if (step === 'load-chunk') {\n message = `Lazy loaded chunk failed to load, try to reload the page: ${error.message}`;\n }\n // TODO: figure out a nicer way to handle routing on the error page, when it can be done.\n return (\n <OptionallyWrapInRouter>\n <ErrorPage status=\"501\" statusMessage={message} />\n </OptionallyWrapInRouter>\n );\n};\n\nconst DefaultErrorBoundaryFallback = ({\n error,\n resetError,\n plugin,\n}: ErrorBoundaryFallbackProps) => {\n return (\n <ErrorPanel\n title={`Error in ${plugin?.getId()}`}\n defaultExpanded\n error={error}\n >\n <Button variant=\"outlined\" onClick={resetError}>\n Retry\n </Button>\n </ErrorPanel>\n );\n};\n\n/**\n * Creates a set of default components to pass along to {@link @backstage/core-app-api#createSpecializedApp}.\n *\n * @public\n */\nexport const components: AppComponents = {\n Progress,\n Router: BrowserRouter,\n NotFoundErrorPage: DefaultNotFoundPage,\n BootErrorPage: DefaultBootErrorPage,\n ErrorBoundaryFallback: DefaultErrorBoundaryFallback,\n};\n","/*\n * Copyright 2020 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 { IconComponent } from '@backstage/core-plugin-api';\nimport MuiApartmentIcon from '@material-ui/icons/Apartment';\nimport MuiBrokenImageIcon from '@material-ui/icons/BrokenImage';\nimport MuiCategoryIcon from '@material-ui/icons/Category';\nimport MuiCreateNewFolderIcon from '@material-ui/icons/CreateNewFolder';\nimport MuiSubjectIcon from '@material-ui/icons/Subject';\nimport MuiSearchIcon from '@material-ui/icons/Search';\nimport MuiChatIcon from '@material-ui/icons/Chat';\nimport MuiDashboardIcon from '@material-ui/icons/Dashboard';\nimport MuiDocsIcon from '@material-ui/icons/Description';\nimport MuiEmailIcon from '@material-ui/icons/Email';\nimport MuiExtensionIcon from '@material-ui/icons/Extension';\nimport MuiGitHubIcon from '@material-ui/icons/GitHub';\nimport MuiHelpIcon from '@material-ui/icons/Help';\nimport MuiLocationOnIcon from '@material-ui/icons/LocationOn';\nimport MuiMemoryIcon from '@material-ui/icons/Memory';\nimport MuiMenuBookIcon from '@material-ui/icons/MenuBook';\nimport MuiPeopleIcon from '@material-ui/icons/People';\nimport MuiPersonIcon from '@material-ui/icons/Person';\nimport MuiWarningIcon from '@material-ui/icons/Warning';\nimport MuiWorkIcon from '@material-ui/icons/Work';\n\nexport const icons = {\n brokenImage: MuiBrokenImageIcon as IconComponent,\n // To be confirmed: see https://github.com/backstage/backstage/issues/4970\n catalog: MuiMenuBookIcon as IconComponent,\n scaffolder: MuiCreateNewFolderIcon as IconComponent,\n techdocs: MuiSubjectIcon as IconComponent,\n search: MuiSearchIcon as IconComponent,\n chat: MuiChatIcon as IconComponent,\n dashboard: MuiDashboardIcon as IconComponent,\n docs: MuiDocsIcon as IconComponent,\n email: MuiEmailIcon as IconComponent,\n github: MuiGitHubIcon as IconComponent,\n group: MuiPeopleIcon as IconComponent,\n help: MuiHelpIcon as IconComponent,\n 'kind:api': MuiExtensionIcon as IconComponent,\n 'kind:component': MuiMemoryIcon as IconComponent,\n 'kind:domain': MuiApartmentIcon as IconComponent,\n 'kind:group': MuiPeopleIcon as IconComponent,\n 'kind:location': MuiLocationOnIcon as IconComponent,\n 'kind:system': MuiCategoryIcon as IconComponent,\n 'kind:user': MuiPersonIcon as IconComponent,\n 'kind:resource': MuiWorkIcon as IconComponent,\n user: MuiPersonIcon as IconComponent,\n warning: MuiWarningIcon as IconComponent,\n};\n","/*\n * Copyright 2021 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 from 'react';\nimport {\n UnifiedThemeProvider,\n themes as builtinThemes,\n} from '@backstage/theme';\nimport DarkIcon from '@material-ui/icons/Brightness2';\nimport LightIcon from '@material-ui/icons/WbSunny';\nimport { AppTheme } from '@backstage/core-plugin-api';\n\nexport const themes: AppTheme[] = [\n {\n id: 'light',\n title: 'Light Theme',\n variant: 'light',\n icon: <LightIcon />,\n Provider: ({ children }) => (\n <UnifiedThemeProvider theme={builtinThemes.light} children={children} />\n ),\n },\n {\n id: 'dark',\n title: 'Dark Theme',\n variant: 'dark',\n icon: <DarkIcon />,\n Provider: ({ children }) => (\n <UnifiedThemeProvider theme={builtinThemes.dark} children={children} />\n ),\n },\n];\n","/*\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 React from 'react';\nimport { ConfigReader } from '@backstage/config';\nimport {\n BackstagePlugin,\n coreExtensionData,\n} from '@backstage/frontend-plugin-api';\nimport { Core } from '../extensions/Core';\nimport { CoreRoutes } from '../extensions/CoreRoutes';\nimport { CoreLayout } from '../extensions/CoreLayout';\nimport { CoreNav } from '../extensions/CoreNav';\nimport {\n createExtensionInstance,\n ExtensionInstance,\n} from './createExtensionInstance';\nimport {\n ExtensionInstanceParameters,\n mergeExtensionParameters,\n readAppExtensionParameters,\n} from './parameters';\nimport { RoutingProvider } from '../routing/RoutingContext';\nimport {\n AnyApiFactory,\n ApiHolder,\n AppComponents,\n AppContext,\n appThemeApiRef,\n ConfigApi,\n configApiRef,\n IconComponent,\n RouteRef,\n BackstagePlugin as LegacyBackstagePlugin,\n featureFlagsApiRef,\n} from '@backstage/core-plugin-api';\nimport { getAvailablePlugins } from './discovery';\nimport {\n ApiFactoryRegistry,\n ApiProvider,\n ApiResolver,\n AppThemeSelector,\n} from '@backstage/core-app-api';\n\n// TODO: Get rid of all of these\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { AppThemeProvider } from '../../../core-app-api/src/app/AppThemeProvider';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { AppContextProvider } from '../../../core-app-api/src/app/AppContext';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { LocalStorageFeatureFlags } from '../../../core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { defaultConfigLoaderSync } from '../../../core-app-api/src/app/defaultConfigLoader';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { overrideBaseUrlConfigs } from '../../../core-app-api/src/app/overrideBaseUrlConfigs';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport {\n apis as defaultApis,\n components as defaultComponents,\n icons as defaultIcons,\n themes as defaultThemes,\n} from '../../../app-defaults/src/defaults';\nimport { BrowserRouter } from 'react-router-dom';\n\n/** @public */\nexport function createApp(options: {\n plugins: BackstagePlugin[];\n config?: ConfigApi;\n}): {\n createRoot(): JSX.Element;\n} {\n const appConfig =\n options?.config ??\n ConfigReader.fromConfigs(overrideBaseUrlConfigs(defaultConfigLoaderSync()));\n\n const builtinExtensions = [Core, CoreRoutes, CoreNav, CoreLayout];\n const discoveredPlugins = getAvailablePlugins();\n const allPlugins = [...discoveredPlugins, ...options.plugins];\n\n // pull in default extension instance from discovered packages\n // apply config to adjust default extension instances and add more\n const extensionParams = mergeExtensionParameters({\n sources: allPlugins,\n builtinExtensions,\n parameters: readAppExtensionParameters(appConfig),\n });\n\n // TODO: validate the config of all extension instances\n // We do it at this point to ensure that merging (if any) of config has already happened\n\n // Create attachment map so that we can look attachments up during instance creation\n const attachmentMap = new Map<\n string,\n Map<string, ExtensionInstanceParameters[]>\n >();\n for (const instanceParams of extensionParams) {\n const [extensionId, pointId = 'default'] = instanceParams.at.split('/');\n\n let pointMap = attachmentMap.get(extensionId);\n if (!pointMap) {\n pointMap = new Map();\n attachmentMap.set(extensionId, pointMap);\n }\n\n let instances = pointMap.get(pointId);\n if (!instances) {\n instances = [];\n pointMap.set(pointId, instances);\n }\n\n instances.push(instanceParams);\n }\n\n const instances = new Map<string, ExtensionInstance>();\n\n function createInstance(\n instanceParams: ExtensionInstanceParameters,\n ): ExtensionInstance {\n const existingInstance = instances.get(instanceParams.extension.id);\n if (existingInstance) {\n return existingInstance;\n }\n\n const attachments = new Map(\n Array.from(\n attachmentMap.get(instanceParams.extension.id)?.entries() ?? [],\n ).map(([inputName, attachmentConfigs]) => [\n inputName,\n attachmentConfigs.map(createInstance),\n ]),\n );\n\n const newInstance = createExtensionInstance({\n extension: instanceParams.extension,\n source: instanceParams.source,\n config: instanceParams.config,\n attachments,\n });\n\n instances.set(instanceParams.extension.id, newInstance);\n\n return newInstance;\n }\n\n const rootConfigs = attachmentMap.get('root')?.get('default') ?? [];\n const rootInstances = rootConfigs.map(instanceParams =>\n createInstance(instanceParams),\n );\n\n const routePaths = extractRouteInfoFromInstanceTree(rootInstances);\n\n const coreInstance = rootInstances.find(({ id }) => id === 'core');\n if (!coreInstance) {\n throw Error('Unable to find core extension instance');\n }\n\n const apiHolder = createApiHolder(coreInstance, appConfig);\n\n const appContext = createLegacyAppContext(allPlugins);\n\n return {\n createRoot() {\n const rootComponents = rootInstances\n .map(e => e.getData(coreExtensionData.reactComponent))\n .filter((x): x is React.ComponentType => !!x);\n return (\n <ApiProvider apis={apiHolder}>\n <AppContextProvider appContext={appContext}>\n <AppThemeProvider>\n <RoutingProvider routePaths={routePaths}>\n {/* TODO: set base path using the logic from AppRouter */}\n <BrowserRouter>\n {rootComponents.map((Component, i) => (\n <Component key={i} />\n ))}\n </BrowserRouter>\n </RoutingProvider>\n </AppThemeProvider>\n </AppContextProvider>\n </ApiProvider>\n );\n },\n };\n}\n\nfunction toLegacyPlugin(plugin: BackstagePlugin): LegacyBackstagePlugin {\n const errorMsg = 'Not implemented in legacy plugin compatibility layer';\n const notImplemented = () => {\n throw new Error(errorMsg);\n };\n return {\n getId(): string {\n return plugin.id;\n },\n get routes(): never {\n throw new Error(errorMsg);\n },\n get externalRoutes(): never {\n throw new Error(errorMsg);\n },\n getApis: notImplemented,\n getFeatureFlags: notImplemented,\n provide: notImplemented,\n __experimentalReconfigure: notImplemented,\n };\n}\n\nfunction createLegacyAppContext(plugins: BackstagePlugin[]): AppContext {\n return {\n getPlugins(): LegacyBackstagePlugin[] {\n return plugins.map(toLegacyPlugin);\n },\n\n getSystemIcon(key: string): IconComponent | undefined {\n return key in defaultIcons\n ? defaultIcons[key as keyof typeof defaultIcons]\n : undefined;\n },\n\n getSystemIcons(): Record<string, IconComponent> {\n return defaultIcons;\n },\n\n getComponents(): AppComponents {\n return defaultComponents;\n },\n };\n}\n\nfunction createApiHolder(\n coreExtension: ExtensionInstance,\n configApi: ConfigApi,\n): ApiHolder {\n const factoryRegistry = new ApiFactoryRegistry();\n\n const apiFactories =\n coreExtension.attachments\n .get('apis')\n ?.map(e => e.getData(coreExtensionData.apiFactory))\n .filter((x): x is AnyApiFactory => !!x) ?? [];\n\n for (const factory of apiFactories) {\n factoryRegistry.register('default', factory);\n }\n\n // TODO: properly discovery feature flags, maybe rework the whole thing\n factoryRegistry.register('default', {\n api: featureFlagsApiRef,\n deps: {},\n factory: () => new LocalStorageFeatureFlags(),\n });\n\n factoryRegistry.register('static', {\n api: appThemeApiRef,\n deps: {},\n // TODO: add extension for registering themes\n factory: () => AppThemeSelector.createWithStorage(defaultThemes),\n });\n\n factoryRegistry.register('static', {\n api: configApiRef,\n deps: {},\n factory: () => configApi,\n });\n\n // TODO: ship these as default extensions instead\n for (const factory of defaultApis as AnyApiFactory[]) {\n if (!factoryRegistry.register('app', factory)) {\n throw new Error(\n `Duplicate or forbidden API factory for ${factory.api} in app`,\n );\n }\n }\n\n ApiResolver.validateFactories(factoryRegistry, factoryRegistry.getAllApis());\n\n return new ApiResolver(factoryRegistry);\n}\n\n/** @internal */\nexport function extractRouteInfoFromInstanceTree(\n roots: ExtensionInstance[],\n): Map<RouteRef, string> {\n const results = new Map<RouteRef, string>();\n\n function visit(current: ExtensionInstance, basePath: string) {\n const routePath = current.getData(coreExtensionData.routePath) ?? '';\n const routeRef = current.getData(coreExtensionData.routeRef);\n\n // TODO: join paths in a more robust way\n const fullPath = basePath + routePath;\n if (routeRef) {\n const routeRefId = (routeRef as any).id; // TODO: properly\n if (routeRefId !== current.id) {\n throw new Error(\n `Route ref '${routeRefId}' must have the same ID as extension '${current.id}'`,\n );\n }\n results.set(routeRef, fullPath);\n }\n\n for (const children of current.attachments.values()) {\n for (const child of children) {\n visit(child, fullPath);\n }\n }\n }\n\n for (const root of roots) {\n visit(root, '');\n }\n return results;\n}\n"],"names":["useStyles","_a","id","builtinThemes","instances","_b","defaultIcons","defaultComponents","defaultThemes","defaultApis"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/frontend-app-api",
3
- "version": "0.0.0",
3
+ "version": "0.1.0-next.0",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -23,7 +23,7 @@
23
23
  "postpack": "backstage-cli package postpack"
24
24
  },
25
25
  "devDependencies": {
26
- "@backstage/cli": "^0.22.13-next.2",
26
+ "@backstage/cli": "^0.22.13-next.3",
27
27
  "@testing-library/jest-dom": "^5.10.1",
28
28
  "@types/react": "^16.13.1 || ^17.0.0"
29
29
  },
@@ -33,11 +33,14 @@
33
33
  "dist"
34
34
  ],
35
35
  "dependencies": {
36
- "@backstage/config": "^1.1.0-next.1",
37
- "@backstage/core-plugin-api": "^1.6.0-next.2",
38
- "@backstage/frontend-plugin-api": "^0.0.0",
39
- "@backstage/plugin-graphiql": "^0.2.54-next.2",
40
- "@backstage/types": "^1.1.0",
36
+ "@backstage/config": "^1.1.0-next.2",
37
+ "@backstage/core-app-api": "^1.10.0-next.3",
38
+ "@backstage/core-components": "^0.13.5-next.3",
39
+ "@backstage/core-plugin-api": "^1.6.0-next.3",
40
+ "@backstage/frontend-plugin-api": "^0.1.0-next.0",
41
+ "@backstage/plugin-graphiql": "^0.2.54-next.3",
42
+ "@backstage/types": "^1.1.1-next.0",
43
+ "@material-ui/core": "^4.12.4",
41
44
  "lodash": "^4.17.21"
42
45
  },
43
46
  "peerDependencies": {