Move createExtensionDataContainer() to shared, internal location

Signed-off-by: Eric Peterson <ericpeterson@spotify.com>
This commit is contained in:
Eric Peterson
2025-03-04 15:25:44 +01:00
parent c1b40f6a04
commit 4c46e99e2e
8 changed files with 41 additions and 39 deletions
@@ -0,0 +1,66 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
AnyExtensionDataRef,
ExtensionDataContainer,
ExtensionDataRef,
ExtensionDataValue,
} from '@backstage/frontend-plugin-api';
export function createExtensionDataContainer<UData extends AnyExtensionDataRef>(
values: Iterable<
UData extends ExtensionDataRef<infer IData, infer IId>
? ExtensionDataValue<IData, IId>
: never
>,
declaredRefs?: ExtensionDataRef<any, any, any>[],
): ExtensionDataContainer<UData> {
const container = new Map<string, ExtensionDataValue<any, any>>();
const verifyRefs =
declaredRefs && new Map(declaredRefs.map(ref => [ref.id, ref]));
for (const output of values) {
if (verifyRefs) {
if (!verifyRefs.delete(output.id)) {
throw new Error(
`extension data '${output.id}' was provided but not declared`,
);
}
}
container.set(output.id, output);
}
const remainingRefs =
verifyRefs &&
Array.from(verifyRefs.values()).filter(ref => !ref.config.optional);
if (remainingRefs && remainingRefs.length > 0) {
throw new Error(
`missing required extension data value(s) '${remainingRefs
.map(ref => ref.id)
.join(', ')}'`,
);
}
return {
get(ref) {
return container.get(ref.id)?.value;
},
[Symbol.iterator]() {
return container.values();
},
} as ExtensionDataContainer<UData>;
}
@@ -14,5 +14,6 @@
* limitations under the License.
*/
export { createExtensionDataContainer } from './createExtensionDataContainer';
export { OpaqueExtensionDefinition } from './InternalExtensionDefinition';
export { OpaqueFrontendPlugin } from './InternalFrontendPlugin';