@backstage/frontend-app-api 0.7.5-next.3 → 0.9.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 +66 -0
- package/dist/core-app-api/src/apis/system/ApiRegistry.esm.js +50 -0
- package/dist/core-app-api/src/apis/system/ApiRegistry.esm.js.map +1 -0
- package/dist/extensions/Root.esm.js +19 -0
- package/dist/extensions/Root.esm.js.map +1 -0
- package/dist/frontend-plugin-api/src/wiring/createExtension.esm.js.map +1 -1
- package/dist/frontend-plugin-api/src/wiring/createExtensionOverrides.esm.js.map +1 -1
- package/dist/frontend-plugin-api/src/wiring/{createPlugin.esm.js → createFrontendPlugin.esm.js} +1 -1
- package/dist/frontend-plugin-api/src/wiring/createFrontendPlugin.esm.js.map +1 -0
- package/dist/frontend-plugin-api/src/wiring/resolveExtensionDefinition.esm.js.map +1 -1
- package/dist/index.d.ts +2 -10
- package/dist/tree/instantiateAppNodeTree.esm.js +8 -5
- package/dist/tree/instantiateAppNodeTree.esm.js.map +1 -1
- package/dist/tree/resolveAppNodeSpecs.esm.js +1 -1
- package/dist/tree/resolveAppNodeSpecs.esm.js.map +1 -1
- package/dist/tree/resolveAppTree.esm.js +40 -20
- package/dist/tree/resolveAppTree.esm.js.map +1 -1
- package/dist/wiring/createApp.esm.js +114 -165
- package/dist/wiring/createApp.esm.js.map +1 -1
- package/package.json +7 -6
- package/dist/apis/implementations/ComponentsApi/DefaultComponentsApi.esm.js +0 -30
- package/dist/apis/implementations/ComponentsApi/DefaultComponentsApi.esm.js.map +0 -1
- package/dist/apis/implementations/IconsApi/DefaultIconsApi.esm.js +0 -15
- package/dist/apis/implementations/IconsApi/DefaultIconsApi.esm.js.map +0 -1
- package/dist/app/src/components/Root/LogoFull.esm.js +0 -33
- package/dist/app/src/components/Root/LogoFull.esm.js.map +0 -1
- package/dist/app/src/components/Root/LogoIcon.esm.js +0 -33
- package/dist/app/src/components/Root/LogoIcon.esm.js.map +0 -1
- package/dist/app-defaults/src/defaults/apis.esm.js +0 -221
- package/dist/app-defaults/src/defaults/apis.esm.js.map +0 -1
- package/dist/app-defaults/src/defaults/components.esm.js +0 -46
- package/dist/app-defaults/src/defaults/components.esm.js.map +0 -1
- package/dist/app-defaults/src/defaults/icons.esm.js +0 -51
- package/dist/app-defaults/src/defaults/icons.esm.js.map +0 -1
- package/dist/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.esm.js +0 -89
- package/dist/core-app-api/src/apis/implementations/AppLanguageApi/AppLanguageSelector.esm.js.map +0 -1
- package/dist/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.esm.js +0 -76
- package/dist/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.esm.js.map +0 -1
- package/dist/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.esm.js +0 -234
- package/dist/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.esm.js.map +0 -1
- package/dist/core-app-api/src/app/AppThemeProvider.esm.js +0 -60
- package/dist/core-app-api/src/app/AppThemeProvider.esm.js.map +0 -1
- package/dist/core-app-api/src/app/isProtectedApp.esm.js +0 -8
- package/dist/core-app-api/src/app/isProtectedApp.esm.js.map +0 -1
- package/dist/core-app-api/src/lib/subjects.esm.js +0 -69
- package/dist/core-app-api/src/lib/subjects.esm.js.map +0 -1
- package/dist/core-plugin-api/src/translation/TranslationRef.esm.js +0 -13
- package/dist/core-plugin-api/src/translation/TranslationRef.esm.js.map +0 -1
- package/dist/core-plugin-api/src/translation/TranslationResource.esm.js +0 -13
- package/dist/core-plugin-api/src/translation/TranslationResource.esm.js.map +0 -1
- package/dist/extensions/App.esm.js +0 -42
- package/dist/extensions/App.esm.js.map +0 -1
- package/dist/extensions/AppLayout.esm.js +0 -34
- package/dist/extensions/AppLayout.esm.js.map +0 -1
- package/dist/extensions/AppNav.esm.js +0 -64
- package/dist/extensions/AppNav.esm.js.map +0 -1
- package/dist/extensions/AppRoot.esm.js +0 -124
- package/dist/extensions/AppRoot.esm.js.map +0 -1
- package/dist/extensions/AppRoutes.esm.js +0 -43
- package/dist/extensions/AppRoutes.esm.js.map +0 -1
- package/dist/extensions/components.esm.js +0 -52
- package/dist/extensions/components.esm.js.map +0 -1
- package/dist/extensions/elements.esm.js +0 -26
- package/dist/extensions/elements.esm.js.map +0 -1
- package/dist/extensions/themes.esm.js +0 -23
- package/dist/extensions/themes.esm.js.map +0 -1
- package/dist/frontend-plugin-api/src/wiring/createPlugin.esm.js.map +0 -1
- package/dist/routing/RouteTracker.esm.js +0 -69
- package/dist/routing/RouteTracker.esm.js.map +0 -1
- package/dist/tree/createAppTree.esm.js +0 -21
- package/dist/tree/createAppTree.esm.js.map +0 -1
- package/dist/wiring/InternalAppContext.esm.js +0 -6
- package/dist/wiring/InternalAppContext.esm.js.map +0 -1
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { OAuthRequestDialog, AlertDisplay } from '@backstage/core-components';
|
|
2
|
-
import { createAppRootElementExtension, createSchemaFromZod } from '@backstage/frontend-plugin-api';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
|
|
5
|
-
const oauthRequestDialogAppRootElement = createAppRootElementExtension({
|
|
6
|
-
namespace: "app",
|
|
7
|
-
name: "oauth-request-dialog",
|
|
8
|
-
element: /* @__PURE__ */ React.createElement(OAuthRequestDialog, null)
|
|
9
|
-
});
|
|
10
|
-
const alertDisplayAppRootElement = createAppRootElementExtension({
|
|
11
|
-
namespace: "app",
|
|
12
|
-
name: "alert-display",
|
|
13
|
-
configSchema: createSchemaFromZod(
|
|
14
|
-
(z) => z.object({
|
|
15
|
-
transientTimeoutMs: z.number().default(5e3),
|
|
16
|
-
anchorOrigin: z.object({
|
|
17
|
-
vertical: z.enum(["top", "bottom"]).default("top"),
|
|
18
|
-
horizontal: z.enum(["left", "center", "right"]).default("center")
|
|
19
|
-
}).default({})
|
|
20
|
-
})
|
|
21
|
-
),
|
|
22
|
-
element: ({ config }) => /* @__PURE__ */ React.createElement(AlertDisplay, { ...config })
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
export { alertDisplayAppRootElement, oauthRequestDialogAppRootElement };
|
|
26
|
-
//# sourceMappingURL=elements.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"elements.esm.js","sources":["../../src/extensions/elements.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 { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components';\nimport {\n createAppRootElementExtension,\n createSchemaFromZod,\n} from '@backstage/frontend-plugin-api';\nimport React from 'react';\n\nexport const oauthRequestDialogAppRootElement = createAppRootElementExtension({\n namespace: 'app',\n name: 'oauth-request-dialog',\n element: <OAuthRequestDialog />,\n});\n\nexport const alertDisplayAppRootElement = createAppRootElementExtension({\n namespace: 'app',\n name: 'alert-display',\n configSchema: createSchemaFromZod(z =>\n z.object({\n transientTimeoutMs: z.number().default(5000),\n anchorOrigin: z\n .object({\n vertical: z.enum(['top', 'bottom']).default('top'),\n horizontal: z.enum(['left', 'center', 'right']).default('center'),\n })\n .default({}),\n }),\n ),\n element: ({ config }) => <AlertDisplay {...config} />,\n});\n"],"names":[],"mappings":";;;;AAuBO,MAAM,mCAAmC,6BAA8B,CAAA;AAAA,EAC5E,SAAW,EAAA,KAAA;AAAA,EACX,IAAM,EAAA,sBAAA;AAAA,EACN,OAAA,sCAAU,kBAAmB,EAAA,IAAA,CAAA;AAC/B,CAAC,EAAA;AAEM,MAAM,6BAA6B,6BAA8B,CAAA;AAAA,EACtE,SAAW,EAAA,KAAA;AAAA,EACX,IAAM,EAAA,eAAA;AAAA,EACN,YAAc,EAAA,mBAAA;AAAA,IAAoB,CAAA,CAAA,KAChC,EAAE,MAAO,CAAA;AAAA,MACP,kBAAoB,EAAA,CAAA,CAAE,MAAO,EAAA,CAAE,QAAQ,GAAI,CAAA;AAAA,MAC3C,YAAA,EAAc,EACX,MAAO,CAAA;AAAA,QACN,QAAA,EAAU,EAAE,IAAK,CAAA,CAAC,OAAO,QAAQ,CAAC,CAAE,CAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACjD,UAAA,EAAY,CAAE,CAAA,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAU,OAAO,CAAC,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,OACjE,CAAA,CACA,OAAQ,CAAA,EAAE,CAAA;AAAA,KACd,CAAA;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,EAAE,MAAA,uBAAc,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAc,GAAG,MAAQ,EAAA,CAAA;AACrD,CAAC;;;;"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { UnifiedThemeProvider, themes } from '@backstage/theme';
|
|
3
|
-
import DarkIcon from '@material-ui/icons/Brightness2';
|
|
4
|
-
import LightIcon from '@material-ui/icons/WbSunny';
|
|
5
|
-
import { createThemeExtension } from '@backstage/frontend-plugin-api';
|
|
6
|
-
|
|
7
|
-
const LightTheme = createThemeExtension({
|
|
8
|
-
id: "light",
|
|
9
|
-
title: "Light Theme",
|
|
10
|
-
variant: "light",
|
|
11
|
-
icon: /* @__PURE__ */ React.createElement(LightIcon, null),
|
|
12
|
-
Provider: ({ children }) => /* @__PURE__ */ React.createElement(UnifiedThemeProvider, { theme: themes.light, children })
|
|
13
|
-
});
|
|
14
|
-
const DarkTheme = createThemeExtension({
|
|
15
|
-
id: "dark",
|
|
16
|
-
title: "Dark Theme",
|
|
17
|
-
variant: "dark",
|
|
18
|
-
icon: /* @__PURE__ */ React.createElement(DarkIcon, null),
|
|
19
|
-
Provider: ({ children }) => /* @__PURE__ */ React.createElement(UnifiedThemeProvider, { theme: themes.dark, children })
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
export { DarkTheme, LightTheme };
|
|
23
|
-
//# sourceMappingURL=themes.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"themes.esm.js","sources":["../../src/extensions/themes.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 UnifiedThemeProvider,\n themes as builtinThemes,\n} from '@backstage/theme';\nimport DarkIcon from '@material-ui/icons/Brightness2';\nimport LightIcon from '@material-ui/icons/WbSunny';\nimport { createThemeExtension } from '@backstage/frontend-plugin-api';\n\nexport const LightTheme = createThemeExtension({\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\nexport const DarkTheme = createThemeExtension({\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"],"names":["builtinThemes"],"mappings":";;;;;;AAyBO,MAAM,aAAa,oBAAqB,CAAA;AAAA,EAC7C,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,aAAA;AAAA,EACP,OAAS,EAAA,OAAA;AAAA,EACT,IAAA,sCAAO,SAAU,EAAA,IAAA,CAAA;AAAA,EACjB,QAAA,EAAU,CAAC,EAAE,QAAS,EAAA,yCACnB,oBAAqB,EAAA,EAAA,KAAA,EAAOA,MAAc,CAAA,KAAA,EAAO,QAAoB,EAAA,CAAA;AAE1E,CAAC,EAAA;AAEM,MAAM,YAAY,oBAAqB,CAAA;AAAA,EAC5C,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,YAAA;AAAA,EACP,OAAS,EAAA,MAAA;AAAA,EACT,IAAA,sCAAO,QAAS,EAAA,IAAA,CAAA;AAAA,EAChB,QAAA,EAAU,CAAC,EAAE,QAAS,EAAA,yCACnB,oBAAqB,EAAA,EAAA,KAAA,EAAOA,MAAc,CAAA,IAAA,EAAM,QAAoB,EAAA,CAAA;AAEzE,CAAC;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createPlugin.esm.js","sources":["../../../../../frontend-plugin-api/src/wiring/createPlugin.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ExtensionDefinition } from './createExtension';\nimport {\n Extension,\n ResolveExtensionId,\n resolveExtensionDefinition,\n} from './resolveExtensionDefinition';\nimport {\n AnyExternalRoutes,\n AnyRoutes,\n BackstagePlugin,\n FeatureFlagConfig,\n} from './types';\n\n/** @public */\nexport interface PluginOptions<\n TId extends string,\n TRoutes extends AnyRoutes,\n TExternalRoutes extends AnyExternalRoutes,\n TExtensions extends readonly ExtensionDefinition<any, any>[],\n> {\n id: TId;\n routes?: TRoutes;\n externalRoutes?: TExternalRoutes;\n extensions?: TExtensions;\n featureFlags?: FeatureFlagConfig[];\n}\n\n/** @public */\nexport interface InternalBackstagePlugin<\n TRoutes extends AnyRoutes = AnyRoutes,\n TExternalRoutes extends AnyExternalRoutes = AnyExternalRoutes,\n> extends BackstagePlugin<TRoutes, TExternalRoutes> {\n readonly version: 'v1';\n readonly extensions: Extension<unknown>[];\n readonly featureFlags: FeatureFlagConfig[];\n}\n\n/** @public */\nexport function createPlugin<\n TId extends string,\n TRoutes extends AnyRoutes = {},\n TExternalRoutes extends AnyExternalRoutes = {},\n TExtensions extends readonly ExtensionDefinition<any, any>[] = [],\n>(\n options: PluginOptions<TId, TRoutes, TExternalRoutes, TExtensions>,\n): BackstagePlugin<\n TRoutes,\n TExternalRoutes,\n {\n [KExtension in TExtensions[number] as ResolveExtensionId<\n KExtension,\n TId\n >]: KExtension;\n }\n> {\n const extensions = new Array<Extension<unknown>>();\n const extensionDefinitionsById = new Map<\n string,\n ExtensionDefinition<unknown>\n >();\n\n for (const def of options.extensions ?? []) {\n const ext = resolveExtensionDefinition(def, { namespace: options.id });\n extensions.push(ext);\n extensionDefinitionsById.set(ext.id, { ...def, namespace: options.id });\n }\n\n if (extensions.length !== extensionDefinitionsById.size) {\n const extensionIds = extensions.map(e => e.id);\n const duplicates = Array.from(\n new Set(\n extensionIds.filter((id, index) => extensionIds.indexOf(id) !== index),\n ),\n );\n // TODO(Rugvip): This could provide some more information about the kind + name of the extensions\n throw new Error(\n `Plugin '${options.id}' provided duplicate extensions: ${duplicates.join(\n ', ',\n )}`,\n );\n }\n\n return {\n $$type: '@backstage/BackstagePlugin',\n version: 'v1',\n id: options.id,\n routes: options.routes ?? ({} as TRoutes),\n externalRoutes: options.externalRoutes ?? ({} as TExternalRoutes),\n featureFlags: options.featureFlags ?? [],\n extensions,\n getExtension(id) {\n return extensionDefinitionsById.get(id);\n },\n toString() {\n return `Plugin{id=${options.id}}`;\n },\n withOverrides(overrides) {\n const overriddenExtensionIds = new Set(\n overrides.extensions.map(\n e => resolveExtensionDefinition(e, { namespace: options.id }).id,\n ),\n );\n const nonOverriddenExtensions = (options.extensions ?? []).filter(\n e =>\n !overriddenExtensionIds.has(\n resolveExtensionDefinition(e, { namespace: options.id }).id,\n ),\n );\n return createPlugin({\n ...options,\n extensions: [...nonOverriddenExtensions, ...overrides.extensions],\n });\n },\n } as InternalBackstagePlugin<TRoutes, TExternalRoutes>;\n}\n\n/** @internal */\nexport function toInternalBackstagePlugin(\n plugin: BackstagePlugin,\n): InternalBackstagePlugin {\n const internal = plugin as InternalBackstagePlugin;\n if (internal.$$type !== '@backstage/BackstagePlugin') {\n throw new Error(`Invalid plugin instance, bad type '${internal.$$type}'`);\n }\n if (internal.version !== 'v1') {\n throw new Error(\n `Invalid plugin instance, bad version '${internal.version}'`,\n );\n }\n return internal;\n}\n"],"names":[],"mappings":";;;AAqIO,SAAS,0BACd,MACyB,EAAA;AACzB,EAAA,MAAM,QAAW,GAAA,MAAA,CAAA;AACjB,EAAI,IAAA,QAAA,CAAS,WAAW,4BAA8B,EAAA;AACpD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsC,mCAAA,EAAA,QAAA,CAAS,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GAC1E;AACA,EAAI,IAAA,QAAA,CAAS,YAAY,IAAM,EAAA;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sCAAA,EAAyC,SAAS,OAAO,CAAA,CAAA,CAAA;AAAA,KAC3D,CAAA;AAAA,GACF;AACA,EAAO,OAAA,QAAA,CAAA;AACT;;;;"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import React, { useEffect } from 'react';
|
|
2
|
-
import { useLocation, matchRoutes } from 'react-router-dom';
|
|
3
|
-
import { AnalyticsContext, useAnalytics } from '@backstage/frontend-plugin-api';
|
|
4
|
-
|
|
5
|
-
const getExtensionContext = (pathname, routes) => {
|
|
6
|
-
try {
|
|
7
|
-
const matches = matchRoutes(routes, { pathname });
|
|
8
|
-
const routeMatch = matches?.filter((match) => match?.route.routeRefs?.size > 0).pop();
|
|
9
|
-
const routeObject = routeMatch?.route;
|
|
10
|
-
if (!routeObject) {
|
|
11
|
-
return void 0;
|
|
12
|
-
}
|
|
13
|
-
if (routeObject.path === "" && pathname !== "/") {
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
|
-
const params = Object.entries(
|
|
17
|
-
routeMatch?.params || {}
|
|
18
|
-
).reduce((acc, [key, value]) => {
|
|
19
|
-
if (value !== void 0 && key !== "*") {
|
|
20
|
-
acc[key] = value;
|
|
21
|
-
}
|
|
22
|
-
return acc;
|
|
23
|
-
}, {});
|
|
24
|
-
const plugin = routeObject.appNode?.spec.source;
|
|
25
|
-
const extension = routeObject.appNode?.spec.extension;
|
|
26
|
-
return {
|
|
27
|
-
params,
|
|
28
|
-
pluginId: plugin?.id || "root",
|
|
29
|
-
extensionId: extension?.id || "App"
|
|
30
|
-
};
|
|
31
|
-
} catch {
|
|
32
|
-
return void 0;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
const TrackNavigation = ({
|
|
36
|
-
pathname,
|
|
37
|
-
search,
|
|
38
|
-
hash,
|
|
39
|
-
attributes
|
|
40
|
-
}) => {
|
|
41
|
-
const analytics = useAnalytics();
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
analytics.captureEvent("navigate", `${pathname}${search}${hash}`, {
|
|
44
|
-
attributes
|
|
45
|
-
});
|
|
46
|
-
}, [analytics, pathname, search, hash, attributes]);
|
|
47
|
-
return null;
|
|
48
|
-
};
|
|
49
|
-
const RouteTracker = ({
|
|
50
|
-
routeObjects
|
|
51
|
-
}) => {
|
|
52
|
-
const { pathname, search, hash } = useLocation();
|
|
53
|
-
const { params, ...attributes } = getExtensionContext(
|
|
54
|
-
pathname,
|
|
55
|
-
routeObjects
|
|
56
|
-
) || { params: {} };
|
|
57
|
-
return /* @__PURE__ */ React.createElement(AnalyticsContext, { attributes }, /* @__PURE__ */ React.createElement(
|
|
58
|
-
TrackNavigation,
|
|
59
|
-
{
|
|
60
|
-
pathname,
|
|
61
|
-
search,
|
|
62
|
-
hash,
|
|
63
|
-
attributes: params
|
|
64
|
-
}
|
|
65
|
-
));
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
export { RouteTracker };
|
|
69
|
-
//# sourceMappingURL=RouteTracker.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RouteTracker.esm.js","sources":["../../src/routing/RouteTracker.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, { useEffect } from 'react';\nimport { matchRoutes, useLocation } from 'react-router-dom';\nimport {\n useAnalytics,\n AnalyticsContext,\n AnalyticsEventAttributes,\n} from '@backstage/frontend-plugin-api';\nimport { BackstageRouteObject } from './types';\n\n/**\n * Returns an extension context given the current pathname and a list of\n * Backstage route objects.\n */\nconst getExtensionContext = (\n pathname: string,\n routes: BackstageRouteObject[],\n) => {\n try {\n // Find matching routes for the given path name.\n const matches = matchRoutes(routes, { pathname });\n\n // Of the matching routes, get the last (e.g. most specific) instance of\n // the BackstageRouteObject that contains a routeRef. Filtering by routeRef\n // ensures subRouteRefs are aligned to their parent routes' context.\n const routeMatch = matches\n ?.filter(match => match?.route.routeRefs?.size > 0)\n .pop();\n const routeObject = routeMatch?.route;\n\n // If there is no route object, then allow inheritance of default context.\n if (!routeObject) {\n return undefined;\n }\n\n // If the matched route is the root route (no path), and the pathname is\n // not the path of the homepage, then inherit from the default context.\n if (routeObject.path === '' && pathname !== '/') {\n return undefined;\n }\n\n const params = Object.entries(\n routeMatch?.params || {},\n ).reduce<AnalyticsEventAttributes>((acc, [key, value]) => {\n if (value !== undefined && key !== '*') {\n acc[key] = value;\n }\n return acc;\n }, {});\n\n const plugin = routeObject.appNode?.spec.source;\n const extension = routeObject.appNode?.spec.extension;\n\n return {\n params,\n pluginId: plugin?.id || 'root',\n extensionId: extension?.id || 'App',\n };\n } catch {\n return undefined;\n }\n};\n\n/**\n * Performs the actual event capture on render.\n */\nconst TrackNavigation = ({\n pathname,\n search,\n hash,\n attributes,\n}: {\n pathname: string;\n search: string;\n hash: string;\n attributes?: AnalyticsEventAttributes;\n}) => {\n const analytics = useAnalytics();\n useEffect(() => {\n analytics.captureEvent('navigate', `${pathname}${search}${hash}`, {\n attributes,\n });\n }, [analytics, pathname, search, hash, attributes]);\n\n return null;\n};\n\n/**\n * Logs a \"navigate\" event with appropriate plugin-level analytics context\n * attributes each time the user navigates to a page.\n */\nexport const RouteTracker = ({\n routeObjects,\n}: {\n routeObjects: BackstageRouteObject[];\n}) => {\n const { pathname, search, hash } = useLocation();\n\n const { params, ...attributes } = getExtensionContext(\n pathname,\n routeObjects,\n ) || { params: {} };\n\n return (\n <AnalyticsContext attributes={attributes}>\n <TrackNavigation\n pathname={pathname}\n search={search}\n hash={hash}\n attributes={params}\n />\n </AnalyticsContext>\n );\n};\n"],"names":[],"mappings":";;;;AA6BA,MAAM,mBAAA,GAAsB,CAC1B,QAAA,EACA,MACG,KAAA;AACH,EAAI,IAAA;AAEF,IAAA,MAAM,OAAU,GAAA,WAAA,CAAY,MAAQ,EAAA,EAAE,UAAU,CAAA,CAAA;AAKhD,IAAM,MAAA,UAAA,GAAa,OACf,EAAA,MAAA,CAAO,CAAS,KAAA,KAAA,KAAA,EAAO,MAAM,SAAW,EAAA,IAAA,GAAO,CAAC,CAAA,CACjD,GAAI,EAAA,CAAA;AACP,IAAA,MAAM,cAAc,UAAY,EAAA,KAAA,CAAA;AAGhC,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAIA,IAAA,IAAI,WAAY,CAAA,IAAA,KAAS,EAAM,IAAA,QAAA,KAAa,GAAK,EAAA;AAC/C,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,SAAS,MAAO,CAAA,OAAA;AAAA,MACpB,UAAA,EAAY,UAAU,EAAC;AAAA,MACvB,MAAiC,CAAA,CAAC,KAAK,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACxD,MAAI,IAAA,KAAA,KAAU,KAAa,CAAA,IAAA,GAAA,KAAQ,GAAK,EAAA;AACtC,QAAA,GAAA,CAAI,GAAG,CAAI,GAAA,KAAA,CAAA;AAAA,OACb;AACA,MAAO,OAAA,GAAA,CAAA;AAAA,KACT,EAAG,EAAE,CAAA,CAAA;AAEL,IAAM,MAAA,MAAA,GAAS,WAAY,CAAA,OAAA,EAAS,IAAK,CAAA,MAAA,CAAA;AACzC,IAAM,MAAA,SAAA,GAAY,WAAY,CAAA,OAAA,EAAS,IAAK,CAAA,SAAA,CAAA;AAE5C,IAAO,OAAA;AAAA,MACL,MAAA;AAAA,MACA,QAAA,EAAU,QAAQ,EAAM,IAAA,MAAA;AAAA,MACxB,WAAA,EAAa,WAAW,EAAM,IAAA,KAAA;AAAA,KAChC,CAAA;AAAA,GACM,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAKA,MAAM,kBAAkB,CAAC;AAAA,EACvB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AACF,CAKM,KAAA;AACJ,EAAA,MAAM,YAAY,YAAa,EAAA,CAAA;AAC/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAU,SAAA,CAAA,YAAA,CAAa,YAAY,CAAG,EAAA,QAAQ,GAAG,MAAM,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA;AAAA,MAChE,UAAA;AAAA,KACD,CAAA,CAAA;AAAA,KACA,CAAC,SAAA,EAAW,UAAU,MAAQ,EAAA,IAAA,EAAM,UAAU,CAAC,CAAA,CAAA;AAElD,EAAO,OAAA,IAAA,CAAA;AACT,CAAA,CAAA;AAMO,MAAM,eAAe,CAAC;AAAA,EAC3B,YAAA;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,EAAE,QAAA,EAAU,MAAQ,EAAA,IAAA,KAAS,WAAY,EAAA,CAAA;AAE/C,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,UAAA,EAAe,GAAA,mBAAA;AAAA,IAChC,QAAA;AAAA,IACA,YAAA;AAAA,GACG,IAAA,EAAE,MAAQ,EAAA,EAAG,EAAA,CAAA;AAElB,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,oBAAiB,UAChB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAY,EAAA,MAAA;AAAA,KAAA;AAAA,GAEhB,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { readAppExtensionsConfig } from './readAppExtensionsConfig.esm.js';
|
|
2
|
-
import { resolveAppTree } from './resolveAppTree.esm.js';
|
|
3
|
-
import { resolveAppNodeSpecs } from './resolveAppNodeSpecs.esm.js';
|
|
4
|
-
import { instantiateAppNodeTree } from './instantiateAppNodeTree.esm.js';
|
|
5
|
-
|
|
6
|
-
function createAppTree(options) {
|
|
7
|
-
const tree = resolveAppTree(
|
|
8
|
-
"app",
|
|
9
|
-
resolveAppNodeSpecs({
|
|
10
|
-
features: options.features,
|
|
11
|
-
builtinExtensions: options.builtinExtensions,
|
|
12
|
-
parameters: readAppExtensionsConfig(options.config),
|
|
13
|
-
forbidden: /* @__PURE__ */ new Set(["app"])
|
|
14
|
-
})
|
|
15
|
-
);
|
|
16
|
-
instantiateAppNodeTree(tree.root);
|
|
17
|
-
return tree;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export { createAppTree };
|
|
21
|
-
//# sourceMappingURL=createAppTree.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createAppTree.esm.js","sources":["../../src/tree/createAppTree.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Extension, FrontendFeature } from '@backstage/frontend-plugin-api';\nimport { readAppExtensionsConfig } from './readAppExtensionsConfig';\nimport { resolveAppTree } from './resolveAppTree';\nimport { resolveAppNodeSpecs } from './resolveAppNodeSpecs';\nimport { AppTree } from '@backstage/frontend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { instantiateAppNodeTree } from './instantiateAppNodeTree';\n\n/** @internal */\nexport interface CreateAppTreeOptions {\n features: FrontendFeature[];\n builtinExtensions: Extension<any, any>[];\n config: Config;\n}\n\n/** @internal */\nexport function createAppTree(options: CreateAppTreeOptions): AppTree {\n const tree = resolveAppTree(\n 'app',\n resolveAppNodeSpecs({\n features: options.features,\n builtinExtensions: options.builtinExtensions,\n parameters: readAppExtensionsConfig(options.config),\n forbidden: new Set(['app']),\n }),\n );\n instantiateAppNodeTree(tree.root);\n return tree;\n}\n"],"names":[],"mappings":";;;;;AAgCO,SAAS,cAAc,OAAwC,EAAA;AACpE,EAAA,MAAM,IAAO,GAAA,cAAA;AAAA,IACX,KAAA;AAAA,IACA,mBAAoB,CAAA;AAAA,MAClB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,mBAAmB,OAAQ,CAAA,iBAAA;AAAA,MAC3B,UAAA,EAAY,uBAAwB,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAClD,SAAW,kBAAA,IAAI,GAAI,CAAA,CAAC,KAAK,CAAC,CAAA;AAAA,KAC3B,CAAA;AAAA,GACH,CAAA;AACA,EAAA,sBAAA,CAAuB,KAAK,IAAI,CAAA,CAAA;AAChC,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InternalAppContext.esm.js","sources":["../../src/wiring/InternalAppContext.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContext } from 'react';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { AppIdentityProxy } from '../../../core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy';\nimport { BackstageRouteObject } from '../routing/types';\n\nexport const InternalAppContext = createContext<\n | undefined\n | {\n appIdentityProxy: AppIdentityProxy;\n routeObjects: BackstageRouteObject[];\n }\n>(undefined);\n"],"names":[],"mappings":";;AAqBa,MAAA,kBAAA,GAAqB,cAMhC,KAAS,CAAA;;;;"}
|