frontend-plugin-api: refuse output override without factory

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2024-09-10 00:45:52 +02:00
parent 2a6142234f
commit 7d028e271d
2 changed files with 38 additions and 1 deletions
@@ -588,7 +588,7 @@ describe('createExtension', () => {
},
});
// @ts-expect-error - this should fail because string output should be merged?
// @ts-expect-error
const override2 = testExtension.override({
output: [numberDataRef],
factory(_, { inputs }) {
@@ -740,6 +740,34 @@ describe('createExtension', () => {
).toBe(undefined);
});
it('should complain when overriding with incompatible output', () => {
const testExtension = createExtension({
namespace: 'test',
attachTo: { id: 'root', input: 'blob' },
output: [stringDataRef],
factory() {
return [stringDataRef('0')];
},
});
// @ts-expect-error - override output is incompatible with factory
const override = testExtension.override({
output: [numberDataRef],
factory() {
return [stringDataRef('1')];
},
});
expect(override).toBeDefined();
expect(() =>
testExtension.override({
output: [numberDataRef],
}),
).toThrowErrorMatchingInlineSnapshot(
`"Refused to override output without also overriding factory"`,
);
});
it('should be able to override input values', () => {
const outputRef = createExtensionDataRef<unknown>().with({
id: 'output',
@@ -430,6 +430,15 @@ export function createExtension<
UFactoryOutput
>;
// TODO(Rugvip): Making this a type check would be optimal, but it seems
// like it's tricky to add that and still have the type
// inference work correctly for the factory output.
if (overrideOptions.output && !overrideOptions.factory) {
throw new Error(
'Refused to override output without also overriding factory',
);
}
return createExtension({
kind: newOptions.kind,
namespace: newOptions.namespace,