frontend-app-api: refactor mergeExtensionParameters -> resolveAppNodeSpecs

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2023-10-15 13:11:11 +02:00
parent c617af1d6d
commit b3977b9864
3 changed files with 24 additions and 35 deletions
@@ -32,10 +32,7 @@ import {
createExtensionInstance,
ExtensionInstance,
} from './createExtensionInstance';
import {
ExtensionInstanceParameters,
mergeExtensionParameters,
} from './parameters';
import { resolveAppNodeSpecs } from './graph/resolveAppNodeSpecs';
import {
AnyApiFactory,
ApiHolder,
@@ -96,6 +93,7 @@ import { RoutingProvider } from '../routing/RoutingProvider';
import { resolveRouteBindings } from '../routing/resolveRouteBindings';
import { collectRouteIds } from '../routing/collectRouteIds';
import { readAppExtensionsConfig } from './graph/readAppExtensionsConfig';
import { AppNodeSpec } from './graph';
/** @public */
export interface ExtensionTreeNode {
@@ -197,7 +195,7 @@ export function createInstances(options: {
// pull in default extension instance from discovered packages
// apply config to adjust default extension instances and add more
const extensionParams = mergeExtensionParameters({
const appNodeSpecs = resolveAppNodeSpecs({
features: options.features,
builtinExtensions,
parameters: readAppExtensionsConfig(options.config),
@@ -207,11 +205,8 @@ export function createInstances(options: {
// We do it at this point to ensure that merging (if any) of config has already happened
// Create attachment map so that we can look attachments up during instance creation
const attachmentMap = new Map<
string,
Map<string, ExtensionInstanceParameters[]>
>();
for (const instanceParams of extensionParams) {
const attachmentMap = new Map<string, Map<string, AppNodeSpec[]>>();
for (const instanceParams of appNodeSpecs) {
const extensionId = instanceParams.attachTo.id;
const pointId = instanceParams.attachTo.input;
let pointMap = attachmentMap.get(extensionId);
@@ -231,9 +226,7 @@ export function createInstances(options: {
const instances = new Map<string, ExtensionInstance>();
function createInstance(
instanceParams: ExtensionInstanceParameters,
): ExtensionInstance {
function createInstance(instanceParams: AppNodeSpec): ExtensionInstance {
const extensionId = instanceParams.extension.id;
const existingInstance = instances.get(extensionId);
if (existingInstance) {
@@ -261,7 +254,7 @@ export function createInstances(options: {
}
const coreInstance = createInstance(
extensionParams.find(p => p.extension.id === 'core')!,
appNodeSpecs.find(p => p.extension.id === 'core')!,
);
return { coreInstance, instances };
@@ -19,7 +19,7 @@ import {
createPlugin,
Extension,
} from '@backstage/frontend-plugin-api';
import { mergeExtensionParameters } from './parameters';
import { resolveAppNodeSpecs } from './resolveAppNodeSpecs';
function makeExt(
id: string,
@@ -33,10 +33,10 @@ function makeExt(
} as Extension<unknown>;
}
describe('mergeExtensionParameters', () => {
describe('resolveAppNodeSpecs', () => {
it('should filter out disabled extension instances', () => {
expect(
mergeExtensionParameters({
resolveAppNodeSpecs({
features: [],
builtinExtensions: [makeExt('a', 'disabled')],
parameters: [],
@@ -48,7 +48,7 @@ describe('mergeExtensionParameters', () => {
const a = makeExt('a');
const b = makeExt('b');
expect(
mergeExtensionParameters({
resolveAppNodeSpecs({
features: [],
builtinExtensions: [a, b],
parameters: [],
@@ -64,7 +64,7 @@ describe('mergeExtensionParameters', () => {
const b = makeExt('b');
const pluginA = createPlugin({ id: 'test', extensions: [a] });
expect(
mergeExtensionParameters({
resolveAppNodeSpecs({
features: [pluginA],
builtinExtensions: [b],
parameters: [
@@ -89,7 +89,7 @@ describe('mergeExtensionParameters', () => {
const b = makeExt('b');
const plugin = createPlugin({ id: 'test', extensions: [a, b] });
expect(
mergeExtensionParameters({
resolveAppNodeSpecs({
features: [plugin],
builtinExtensions: [],
parameters: [
@@ -127,7 +127,7 @@ describe('mergeExtensionParameters', () => {
const a = makeExt('a', 'disabled');
const b = makeExt('b', 'disabled');
expect(
mergeExtensionParameters({
resolveAppNodeSpecs({
features: [createPlugin({ id: 'empty', extensions: [] })],
builtinExtensions: [a, b],
parameters: [
@@ -155,7 +155,7 @@ describe('mergeExtensionParameters', () => {
const bOverride = makeExt('b', 'disabled', 'other');
const cOverride = makeExt('c');
const result = mergeExtensionParameters({
const result = resolveAppNodeSpecs({
features: [
plugin,
createExtensionOverrides({
@@ -188,7 +188,7 @@ describe('mergeExtensionParameters', () => {
const bOverride = makeExt('b', 'disabled');
const cOverride = makeExt('a', 'disabled');
const result = mergeExtensionParameters({
const result = resolveAppNodeSpecs({
features: [
createPlugin({ id: 'test', extensions: [a, b, c] }),
createExtensionOverrides({
@@ -20,22 +20,16 @@ import {
ExtensionOverrides,
} from '@backstage/frontend-plugin-api';
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
import { toInternalExtensionOverrides } from '../../../frontend-plugin-api/src/wiring/createExtensionOverrides';
import { ExtensionParameters } from './graph/readAppExtensionsConfig';
export interface ExtensionInstanceParameters {
extension: Extension<unknown>;
source?: BackstagePlugin;
attachTo: { id: string; input: string };
config?: unknown;
}
import { toInternalExtensionOverrides } from '../../../../frontend-plugin-api/src/wiring/createExtensionOverrides';
import { ExtensionParameters } from './readAppExtensionsConfig';
import { AppNodeSpec } from './types';
/** @internal */
export function mergeExtensionParameters(options: {
export function resolveAppNodeSpecs(options: {
features: (BackstagePlugin | ExtensionOverrides)[];
builtinExtensions: Extension<unknown>[];
parameters: Array<ExtensionParameters>;
}): ExtensionInstanceParameters[] {
}): AppNodeSpec[] {
const { builtinExtensions, parameters } = options;
const plugins = options.features.filter(
@@ -207,8 +201,10 @@ export function mergeExtensionParameters(options: {
return configuredExtensions
.filter(override => !override.params.disabled)
.map(param => ({
extension: param.extension,
id: param.extension.id,
attachTo: param.params.attachTo,
extension: param.extension,
disabled: param.params.disabled,
source: param.params.source,
config: param.params.config,
}));