frontend-plugin-api: working types for extension data containers as iterables

Co-authored-by: Fredrik Adelöw <freben@gmail.com>
Co-authored-by: blam <ben@blam.sh>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2024-08-06 15:47:57 +02:00
parent 1533b959ef
commit eda2165093
3 changed files with 27 additions and 11 deletions
@@ -65,7 +65,17 @@ export type ExtensionDataValues<TExtensionData extends AnyExtensionDataMap> = {
/** @public */
export type ExtensionDataContainer<UExtensionData extends AnyExtensionDataRef> =
{
Iterable<
UExtensionData extends ExtensionDataRef<
infer IData,
infer IId,
infer IConfig
>
? IConfig['optional'] extends true
? never
: ExtensionDataValue<IData, IId>
: never
> & {
get<TId extends UExtensionData['id']>(
ref: ExtensionDataRef<any, TId, any>,
): UExtensionData extends ExtensionDataRef<infer IData, TId, infer IConfig>
@@ -494,11 +494,18 @@ describe('createExtensionBlueprint', () => {
blueprint.make({
output: [testDataRef1, testDataRef2],
*factory(origFactory) {
yield origFactory({});
yield* origFactory({});
yield testDataRef2('bar');
},
});
blueprint.make({
output: [testDataRef1, testDataRef2],
factory(origFactory) {
return [...origFactory({}), testDataRef2('bar')];
},
});
expect(true).toBe(true);
// todo: test that the data is actually available
});
@@ -518,8 +525,7 @@ describe('createExtensionBlueprint', () => {
blueprint.make({
output: [testDataRef2.optional()],
*factory(origFactory) {
// yield testDataRef1('bar');
*factory() {
yield testDataRef2('bar');
},
});
@@ -18,6 +18,7 @@ import { AppNode } from '../apis';
import { Expand } from '../types';
import {
CreateExtensionOptions,
ExtensionDataContainer,
ExtensionDefinition,
ResolvedExtensionInputs,
VerifyExtensionFactoryOutput,
@@ -27,7 +28,6 @@ import { z } from 'zod';
import { ExtensionInput } from './createExtensionInput';
import {
AnyExtensionDataRef,
ExtensionDataRefToValue,
ExtensionDataValue,
} from './createExtensionDataRef';
@@ -100,7 +100,7 @@ export interface ExtensionBlueprint<
[key in string]: (zImpl: typeof z) => z.ZodType;
},
UFactoryOutput extends ExtensionDataValue<any, any>,
UExtraOutput extends AnyExtensionDataRef,
UNewOutput extends AnyExtensionDataRef,
TExtraInputs extends {
[inputName in string]: ExtensionInput<
AnyExtensionDataRef,
@@ -117,7 +117,7 @@ export interface ExtensionBlueprint<
[KName in keyof TInputs]?: `Error: Input '${KName &
string}' is already defined in parent definition`;
};
output?: Array<UExtraOutput>;
output?: Array<UNewOutput>;
config?: {
schema: TExtensionConfigSchema & {
[KName in keyof TConfig]?: `Error: Config key '${KName &
@@ -133,7 +133,7 @@ export interface ExtensionBlueprint<
config?: TConfig;
inputs?: Expand<ResolvedExtensionInputs<TInputs>>;
},
) => Iterable<ExtensionDataRefToValue<UOutput>>,
) => ExtensionDataContainer<UOutput>,
context: {
node: AppNode;
config: TConfig & {
@@ -145,7 +145,7 @@ export interface ExtensionBlueprint<
},
): Iterable<UFactoryOutput>;
} & VerifyExtensionFactoryOutput<
UOutput & UExtraOutput,
AnyExtensionDataRef extends UNewOutput ? UOutput : UNewOutput,
UFactoryOutput
>)
| {
@@ -236,7 +236,7 @@ class ExtensionBlueprintImpl<
};
inputs?: Expand<ResolvedExtensionInputs<TInputs>>;
},
) => Iterable<ExtensionDataRefToValue<UOutput>>,
) => ExtensionDataContainer<UOutput>,
context: {
node: AppNode;
config: {
@@ -311,7 +311,7 @@ class ExtensionBlueprintImpl<
};
inputs?: Expand<ResolvedExtensionInputs<TInputs>>;
},
): Iterable<ExtensionDataRefToValue<UOutput>> => {
): ExtensionDataContainer<UOutput> => {
return this.options.factory(innerParams, {
node,
config: innerContext?.config ?? config,