From 67b857fde600e6c1019c0d511d554dcb654f2440 Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Wed, 17 Jul 2024 12:06:24 -0400 Subject: [PATCH 1/7] Added extension version and type to record-video --- packages/extension-record-video/src/index.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/extension-record-video/src/index.ts b/packages/extension-record-video/src/index.ts index 1774cfdbb9..bf6b2ced55 100644 --- a/packages/extension-record-video/src/index.ts +++ b/packages/extension-record-video/src/index.ts @@ -58,10 +58,18 @@ class RecordVideoExtension implements JsPsychExtension { if (!this.currentTrialData.record_video_data) { this.onUpdateCallback = () => { - resolve(this.currentTrialData); + resolve({ + extension_type: "record-video", + extension_version: version, + ...this.currentTrialData, + }); }; } else { - resolve(this.currentTrialData); + resolve({ + extension_type: "record-video", + extension_version: version, + ...this.currentTrialData, + }); } }); }; From b94d961f9b29516d58ee826835d73c9e5dbf9a6d Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Thu, 18 Jul 2024 09:33:34 -0400 Subject: [PATCH 2/7] Added changeset for all metadata additions to all extensions --- .changeset/gentle-icons-wave.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/gentle-icons-wave.md diff --git a/.changeset/gentle-icons-wave.md b/.changeset/gentle-icons-wave.md new file mode 100644 index 0000000000..850d49b78a --- /dev/null +++ b/.changeset/gentle-icons-wave.md @@ -0,0 +1,7 @@ +--- +"@jspsych/extension-mouse-tracking": minor +"@jspsych/extension-record-video": minor +"@jspsych/extension-webgazer": minor +--- + +Extensions now return an extension_type and extension_version when returning data (metadata purposes). From 81ed9ad3f8edf038c8f979e21ae6dd45a8d7f42a Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Thu, 18 Jul 2024 11:50:03 -0400 Subject: [PATCH 3/7] Changed jsPsych and extensions to read version and name from class --- .../extension-mouse-tracking/src/index.ts | 2 -- packages/extension-record-video/src/index.ts | 12 ++----- packages/extension-webgazer/src/index.ts | 2 -- packages/jspsych/src/ExtensionManager.ts | 33 +++++++++++++++---- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/packages/extension-mouse-tracking/src/index.ts b/packages/extension-mouse-tracking/src/index.ts index cb2aa81c15..37bcc0d23d 100644 --- a/packages/extension-mouse-tracking/src/index.ts +++ b/packages/extension-mouse-tracking/src/index.ts @@ -155,8 +155,6 @@ class MouseTrackingExtension implements JsPsychExtension { } return { - extension_type: "mouse-tracking", - extension_version: version, mouse_tracking_data: this.currentTrialData, mouse_tracking_targets: Object.fromEntries(this.currentTrialTargets.entries()), }; diff --git a/packages/extension-record-video/src/index.ts b/packages/extension-record-video/src/index.ts index bf6b2ced55..1774cfdbb9 100644 --- a/packages/extension-record-video/src/index.ts +++ b/packages/extension-record-video/src/index.ts @@ -58,18 +58,10 @@ class RecordVideoExtension implements JsPsychExtension { if (!this.currentTrialData.record_video_data) { this.onUpdateCallback = () => { - resolve({ - extension_type: "record-video", - extension_version: version, - ...this.currentTrialData, - }); + resolve(this.currentTrialData); }; } else { - resolve({ - extension_type: "record-video", - extension_version: version, - ...this.currentTrialData, - }); + resolve(this.currentTrialData); } }); }; diff --git a/packages/extension-webgazer/src/index.ts b/packages/extension-webgazer/src/index.ts index 2f0f7368f2..56f02a4496 100644 --- a/packages/extension-webgazer/src/index.ts +++ b/packages/extension-webgazer/src/index.ts @@ -211,8 +211,6 @@ class WebGazerExtension implements JsPsychExtension { // send back the gazeData return { - extension_type: "webgazer", - extension_version: version, webgazer_data: this.currentTrialData, webgazer_targets: this.currentTrialTargets, }; diff --git a/packages/jspsych/src/ExtensionManager.ts b/packages/jspsych/src/ExtensionManager.ts index 75802759d2..bafc139bfc 100644 --- a/packages/jspsych/src/ExtensionManager.ts +++ b/packages/jspsych/src/ExtensionManager.ts @@ -40,9 +40,28 @@ export class ExtensionManager { public async initializeExtensions() { await Promise.all( - this.extensionsConfiguration.map(({ type, params = {} }) => - this.getExtensionInstanceByClass(type).initialize(params) - ) + this.extensionsConfiguration.map(({ type, params = {} }) => { + this.getExtensionInstanceByClass(type).initialize(params); + + const extensionInfo = type["info"] as JsPsychExtensionInfo; + + if (!("version" in extensionInfo) && !("data" in extensionInfo)) { + console.warn( + extensionInfo["name"], + "is missing the 'version' and 'data' fields. Please update extension as 'version' and 'data' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details." + ); + } else if (!("version" in extensionInfo)) { + console.warn( + extensionInfo["name"], + "is missing the 'version' field. Please update extension as 'version' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details." + ); + } else if (!("data" in extensionInfo)) { + console.warn( + extensionInfo["name"], + "is missing the 'data' field. Please update extension as 'data' will be required in v9. See https://www.jspsych.org/latest/developers/extension-development/ for more details." + ); + } + }) ); } @@ -67,14 +86,14 @@ export class ExtensionManager { ) ); - const extensionInfo = trialExtensionsConfiguration.length + const extensionInfos = trialExtensionsConfiguration.length ? { - extension_type: results.map((result) => result.extension_type), - extension_version: results.map((result) => result.extension_version), + extension_type: trialExtensionsConfiguration.map(({ type }) => type["info"].name), + extension_version: trialExtensionsConfiguration.map(({ type }) => type["info"].version), } : {}; - results.push(extensionInfo); + results.push(extensionInfos); return Object.assign({}, ...results); } From 6ab31019ffcc49537b9b0fe0a2c3a0b96f2cdd68 Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Thu, 18 Jul 2024 12:11:17 -0400 Subject: [PATCH 4/7] Changed push to unshift to make extension version and type appear first --- packages/jspsych/src/ExtensionManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jspsych/src/ExtensionManager.ts b/packages/jspsych/src/ExtensionManager.ts index bafc139bfc..664162606c 100644 --- a/packages/jspsych/src/ExtensionManager.ts +++ b/packages/jspsych/src/ExtensionManager.ts @@ -93,7 +93,7 @@ export class ExtensionManager { } : {}; - results.push(extensionInfos); + results.unshift(extensionInfos); return Object.assign({}, ...results); } From 078357306c20736a71bda3cf6e7755466a372edc Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Thu, 18 Jul 2024 12:13:25 -0400 Subject: [PATCH 5/7] Added changeset --- .changeset/empty-lies-cheer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/empty-lies-cheer.md diff --git a/.changeset/empty-lies-cheer.md b/.changeset/empty-lies-cheer.md new file mode 100644 index 0000000000..77c8ee751b --- /dev/null +++ b/.changeset/empty-lies-cheer.md @@ -0,0 +1,5 @@ +--- +"jspsych": minor +--- + +ExtensionManager now uses extension instantiation data to produce version and type, and warns users if fields are missing. From e94691cf6bb543c0cc96c813ee68707c7bba8591 Mon Sep 17 00:00:00 2001 From: Bankminer78 Date: Thu, 18 Jul 2024 12:22:13 -0400 Subject: [PATCH 6/7] Updated tests --- packages/jspsych/src/ExtensionManager.spec.ts | 4 +--- packages/jspsych/tests/extensions/test-extension.ts | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jspsych/src/ExtensionManager.spec.ts b/packages/jspsych/src/ExtensionManager.spec.ts index 8f634a4bbe..a14fb21b9b 100644 --- a/packages/jspsych/src/ExtensionManager.spec.ts +++ b/packages/jspsych/src/ExtensionManager.spec.ts @@ -102,8 +102,6 @@ describe("ExtensionManager", () => { const onFinishCallback = jest.mocked(manager.extensions.test.on_finish); onFinishCallback.mockReturnValue({ - extension_type: "test", - extension_version: "1.0", extension: "result", }); @@ -115,7 +113,7 @@ describe("ExtensionManager", () => { expect(onFinishCallback).toHaveBeenCalledWith({ my: "option" }); expect(results).toEqual({ extension_type: ["test"], - extension_version: ["1.0"], + extension_version: ["0.0.1"], extension: "result", }); }); diff --git a/packages/jspsych/tests/extensions/test-extension.ts b/packages/jspsych/tests/extensions/test-extension.ts index d7391daada..c649ae0fec 100644 --- a/packages/jspsych/tests/extensions/test-extension.ts +++ b/packages/jspsych/tests/extensions/test-extension.ts @@ -3,6 +3,8 @@ import { JsPsych, JsPsychExtension } from "../../src"; export class TestExtension implements JsPsychExtension { static info = { name: "test", + version: "0.0.1", + data: {}, }; constructor(private jsPsych: JsPsych) {} From 054ba1b117263137eaec9e32c96e04c0f0a81938 Mon Sep 17 00:00:00 2001 From: Josh de Leeuw Date: Thu, 18 Jul 2024 14:16:47 -0400 Subject: [PATCH 7/7] Update empty-lies-cheer.md --- .changeset/empty-lies-cheer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/empty-lies-cheer.md b/.changeset/empty-lies-cheer.md index 77c8ee751b..b7d9d0570a 100644 --- a/.changeset/empty-lies-cheer.md +++ b/.changeset/empty-lies-cheer.md @@ -1,5 +1,5 @@ --- -"jspsych": minor +"jspsych": patch --- -ExtensionManager now uses extension instantiation data to produce version and type, and warns users if fields are missing. +ExtensionManager correctly uses extension instantiation data to produce version and type, and warns users if fields are missing.