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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user