diff --git a/packages/jspsych/src/ExtensionManager.ts b/packages/jspsych/src/ExtensionManager.ts index 664162606c..0d627316e6 100644 --- a/packages/jspsych/src/ExtensionManager.ts +++ b/packages/jspsych/src/ExtensionManager.ts @@ -4,7 +4,7 @@ import { JsPsychExtension, JsPsychExtensionInfo } from "./modules/extensions"; import { TrialExtensionsConfiguration } from "./timeline"; export type GlobalExtensionsConfiguration = Array<{ - type: Class; + type: Class & { info: JsPsychExtensionInfo }; params?: Record; }>; @@ -12,12 +12,16 @@ export interface ExtensionManagerDependencies { /** * Given an extension class, create a new instance of it and return it. */ - instantiateExtension(extensionClass: Class): JsPsychExtension; + instantiateExtension( + extensionClass: Class & { info: JsPsychExtensionInfo } + ): JsPsychExtension; } export class ExtensionManager { - private static getExtensionNameByClass(extensionClass: Class) { - return (extensionClass["info"] as JsPsychExtensionInfo).name; + private static getExtensionNameByClass( + extensionClass: Class & { info: JsPsychExtensionInfo } + ) { + return extensionClass.info.name; } public readonly extensions: Record; @@ -34,7 +38,9 @@ export class ExtensionManager { ); } - private getExtensionInstanceByClass(extensionClass: Class) { + private getExtensionInstanceByClass( + extensionClass: Class & { info: JsPsychExtensionInfo } + ) { return this.extensions[ExtensionManager.getExtensionNameByClass(extensionClass)]; } @@ -43,7 +49,7 @@ export class ExtensionManager { this.extensionsConfiguration.map(({ type, params = {} }) => { this.getExtensionInstanceByClass(type).initialize(params); - const extensionInfo = type["info"] as JsPsychExtensionInfo; + const extensionInfo = type.info; if (!("version" in extensionInfo) && !("data" in extensionInfo)) { console.warn( @@ -88,8 +94,10 @@ export class ExtensionManager { const extensionInfos = trialExtensionsConfiguration.length ? { - extension_type: trialExtensionsConfiguration.map(({ type }) => type["info"].name), - extension_version: trialExtensionsConfiguration.map(({ type }) => type["info"].version), + extension_type: trialExtensionsConfiguration.map(({ type }) => type.info.name), + extension_version: trialExtensionsConfiguration.map( + ({ type }) => type.info.version ?? "" + ), } : {}; diff --git a/packages/jspsych/src/modules/extensions.ts b/packages/jspsych/src/modules/extensions.ts index dd4210a744..c9c60bf352 100644 --- a/packages/jspsych/src/modules/extensions.ts +++ b/packages/jspsych/src/modules/extensions.ts @@ -1,3 +1,5 @@ +import { Class } from "type-fest"; + import { ParameterInfos } from "./plugins"; export interface JsPsychExtensionInfo { diff --git a/packages/jspsych/src/timeline/Trial.spec.ts b/packages/jspsych/src/timeline/Trial.spec.ts index 2a53226257..ebebc87ff2 100644 --- a/packages/jspsych/src/timeline/Trial.spec.ts +++ b/packages/jspsych/src/timeline/Trial.spec.ts @@ -615,8 +615,11 @@ describe("Trial", () => { it("invokes extension callbacks and includes extension results", async () => { dependencies.runOnFinishExtensionCallbacks.mockResolvedValue({ extension: "result" }); + const mockExtensionClass = jest.fn() as any; + mockExtensionClass.info = { name: "test-extension", version: "1.0.0" }; + const extensionsConfig: TrialExtensionsConfiguration = [ - { type: jest.fn(), params: { my: "option" } }, + { type: mockExtensionClass, params: { my: "option" } }, ]; const trial = createTrial({ @@ -654,9 +657,12 @@ describe("Trial", () => { ); } + const mockExtensionClass2 = jest.fn() as any; + mockExtensionClass2.info = { name: "test-extension-2", version: "1.0.0" }; + const trial = createTrial({ type: TestPlugin, - extensions: [{ type: jest.fn(), params: { my: "option" } }], + extensions: [{ type: mockExtensionClass2, params: { my: "option" } }], on_start: createInvocationOrderCallback("on_start"), on_load: createInvocationOrderCallback("on_load"), on_finish: createInvocationOrderCallback("on_finish"), diff --git a/packages/jspsych/src/timeline/index.ts b/packages/jspsych/src/timeline/index.ts index f929e00ccd..c7c4d364e9 100644 --- a/packages/jspsych/src/timeline/index.ts +++ b/packages/jspsych/src/timeline/index.ts @@ -1,6 +1,6 @@ import { Class } from "type-fest"; -import { JsPsychExtension } from "../modules/extensions"; +import { JsPsychExtension, JsPsychExtensionInfo } from "../modules/extensions"; import { JsPsychPlugin, PluginInfo } from "../modules/plugins"; import { Trial } from "./Trial"; import { PromiseWrapper } from "./util"; @@ -12,7 +12,7 @@ export class TimelineVariable { export type Parameter = T | (() => T) | TimelineVariable; export type TrialExtensionsConfiguration = Array<{ - type: Class; + type: Class & { info: JsPsychExtensionInfo }; params?: Record; }>;