jspsych 6.3.1 → 7.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/README.md +36 -37
  2. package/css/jspsych.css +39 -39
  3. package/dist/JsPsych.d.ts +112 -0
  4. package/dist/TimelineNode.d.ts +34 -0
  5. package/dist/index.browser.js +3171 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.browser.min.js +2 -0
  8. package/dist/index.browser.min.js.map +1 -0
  9. package/dist/index.cjs +3165 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.ts +11 -0
  12. package/dist/index.js +3159 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/migration.d.ts +3 -0
  15. package/dist/modules/data/DataCollection.d.ts +45 -0
  16. package/dist/modules/data/DataColumn.d.ts +15 -0
  17. package/dist/modules/data/index.d.ts +25 -0
  18. package/dist/modules/data/utils.d.ts +3 -0
  19. package/dist/modules/extensions.d.ts +22 -0
  20. package/dist/modules/plugin-api/HardwareAPI.d.ts +15 -0
  21. package/dist/modules/plugin-api/KeyboardListenerAPI.d.ts +34 -0
  22. package/dist/modules/plugin-api/MediaAPI.d.ts +27 -0
  23. package/dist/modules/plugin-api/SimulationAPI.d.ts +41 -0
  24. package/dist/modules/plugin-api/TimeoutAPI.d.ts +5 -0
  25. package/dist/modules/plugin-api/index.d.ts +8 -0
  26. package/dist/modules/plugins.d.ts +136 -0
  27. package/dist/modules/randomization.d.ts +35 -0
  28. package/dist/modules/turk.d.ts +40 -0
  29. package/dist/modules/utils.d.ts +7 -0
  30. package/package.json +32 -15
  31. package/src/JsPsych.ts +884 -0
  32. package/src/TimelineNode.ts +536 -0
  33. package/src/index.ts +71 -0
  34. package/src/migration.ts +37 -0
  35. package/src/modules/data/DataCollection.ts +198 -0
  36. package/src/modules/data/DataColumn.ts +86 -0
  37. package/src/modules/data/index.ts +174 -0
  38. package/src/modules/data/utils.ts +75 -0
  39. package/src/modules/extensions.ts +23 -0
  40. package/src/modules/plugin-api/HardwareAPI.ts +32 -0
  41. package/src/modules/plugin-api/KeyboardListenerAPI.ts +165 -0
  42. package/src/modules/plugin-api/MediaAPI.ts +337 -0
  43. package/src/modules/plugin-api/SimulationAPI.ts +181 -0
  44. package/src/modules/plugin-api/TimeoutAPI.ts +16 -0
  45. package/src/modules/plugin-api/index.ts +28 -0
  46. package/src/modules/plugins.ts +165 -0
  47. package/src/modules/randomization.ts +327 -0
  48. package/src/modules/turk.ts +99 -0
  49. package/src/modules/utils.ts +30 -0
  50. package/.github/workflows/jest.yml +0 -20
  51. package/code-of-conduct.md +0 -56
  52. package/contributors.md +0 -61
  53. package/docs/CNAME +0 -1
  54. package/docs/about/about.md +0 -18
  55. package/docs/about/contributing.md +0 -43
  56. package/docs/about/license.md +0 -25
  57. package/docs/about/support.md +0 -7
  58. package/docs/core_library/jspsych-core.md +0 -719
  59. package/docs/core_library/jspsych-data.md +0 -587
  60. package/docs/core_library/jspsych-pluginAPI.md +0 -624
  61. package/docs/core_library/jspsych-randomization.md +0 -389
  62. package/docs/core_library/jspsych-turk.md +0 -98
  63. package/docs/extensions/extensions.md +0 -83
  64. package/docs/extensions/jspsych-ext-webgazer.md +0 -137
  65. package/docs/img/blue.png +0 -0
  66. package/docs/img/devtools-change-css.png +0 -0
  67. package/docs/img/devtools-css-errors.png +0 -0
  68. package/docs/img/devtools-inspect-element.png +0 -0
  69. package/docs/img/folder-setup.png +0 -0
  70. package/docs/img/folder-with-html.png +0 -0
  71. package/docs/img/githubreleases.jpg +0 -0
  72. package/docs/img/jspsych-favicon.png +0 -0
  73. package/docs/img/jspsych-logo-no-text-mono.svg +0 -493
  74. package/docs/img/jspsych-logo.jpg +0 -0
  75. package/docs/img/orange.png +0 -0
  76. package/docs/img/palmer_stim.png +0 -0
  77. package/docs/img/progress_bar.png +0 -0
  78. package/docs/img/prolific-study-completion.png +0 -0
  79. package/docs/img/prolific-study-link.png +0 -0
  80. package/docs/img/visual_search_example.jpg +0 -0
  81. package/docs/index.md +0 -9
  82. package/docs/overview/browser-device-support.md +0 -35
  83. package/docs/overview/callbacks.md +0 -180
  84. package/docs/overview/data.md +0 -281
  85. package/docs/overview/dynamic-parameters.md +0 -147
  86. package/docs/overview/exclude-browser.md +0 -32
  87. package/docs/overview/experiment-options.md +0 -149
  88. package/docs/overview/eye-tracking.md +0 -271
  89. package/docs/overview/fullscreen.md +0 -36
  90. package/docs/overview/media-preloading.md +0 -369
  91. package/docs/overview/mturk.md +0 -77
  92. package/docs/overview/plugins.md +0 -320
  93. package/docs/overview/progress-bar.md +0 -110
  94. package/docs/overview/prolific.md +0 -78
  95. package/docs/overview/record-browser-interactions.md +0 -23
  96. package/docs/overview/running-experiments.md +0 -95
  97. package/docs/overview/style.md +0 -293
  98. package/docs/overview/timeline.md +0 -457
  99. package/docs/plugins/jspsych-animation.md +0 -40
  100. package/docs/plugins/jspsych-audio-button-response.md +0 -60
  101. package/docs/plugins/jspsych-audio-keyboard-response.md +0 -58
  102. package/docs/plugins/jspsych-audio-slider-response.md +0 -53
  103. package/docs/plugins/jspsych-call-function.md +0 -81
  104. package/docs/plugins/jspsych-canvas-button-response.md +0 -66
  105. package/docs/plugins/jspsych-canvas-keyboard-response.md +0 -68
  106. package/docs/plugins/jspsych-canvas-slider-response.md +0 -89
  107. package/docs/plugins/jspsych-categorize-animation.md +0 -60
  108. package/docs/plugins/jspsych-categorize-html.md +0 -53
  109. package/docs/plugins/jspsych-categorize-image.md +0 -53
  110. package/docs/plugins/jspsych-cloze.md +0 -45
  111. package/docs/plugins/jspsych-external-html.md +0 -70
  112. package/docs/plugins/jspsych-free-sort.md +0 -56
  113. package/docs/plugins/jspsych-fullscreen.md +0 -57
  114. package/docs/plugins/jspsych-html-button-response.md +0 -42
  115. package/docs/plugins/jspsych-html-keyboard-response.md +0 -51
  116. package/docs/plugins/jspsych-html-slider-response.md +0 -45
  117. package/docs/plugins/jspsych-iat-html.md +0 -64
  118. package/docs/plugins/jspsych-iat-image.md +0 -64
  119. package/docs/plugins/jspsych-image-button-response.md +0 -48
  120. package/docs/plugins/jspsych-image-keyboard-response.md +0 -58
  121. package/docs/plugins/jspsych-image-slider-response.md +0 -54
  122. package/docs/plugins/jspsych-instructions.md +0 -58
  123. package/docs/plugins/jspsych-maxdiff.md +0 -41
  124. package/docs/plugins/jspsych-preload.md +0 -128
  125. package/docs/plugins/jspsych-rdk.md +0 -119
  126. package/docs/plugins/jspsych-reconstruction.md +0 -48
  127. package/docs/plugins/jspsych-resize.md +0 -39
  128. package/docs/plugins/jspsych-same-different-html.md +0 -53
  129. package/docs/plugins/jspsych-same-different-image.md +0 -66
  130. package/docs/plugins/jspsych-serial-reaction-time-mouse.md +0 -52
  131. package/docs/plugins/jspsych-serial-reaction-time.md +0 -57
  132. package/docs/plugins/jspsych-survey-html-form.md +0 -50
  133. package/docs/plugins/jspsych-survey-likert.md +0 -70
  134. package/docs/plugins/jspsych-survey-multi-choice.md +0 -48
  135. package/docs/plugins/jspsych-survey-multi-select.md +0 -53
  136. package/docs/plugins/jspsych-survey-text.md +0 -63
  137. package/docs/plugins/jspsych-video-button-response.md +0 -54
  138. package/docs/plugins/jspsych-video-keyboard-response.md +0 -50
  139. package/docs/plugins/jspsych-video-slider-response.md +0 -60
  140. package/docs/plugins/jspsych-virtual-chinrest.md +0 -105
  141. package/docs/plugins/jspsych-visual-search-circle.md +0 -52
  142. package/docs/plugins/jspsych-vsl-animate-occlusion.md +0 -55
  143. package/docs/plugins/jspsych-vsl-grid-scene.md +0 -62
  144. package/docs/plugins/jspsych-webgazer-calibrate.md +0 -61
  145. package/docs/plugins/jspsych-webgazer-init-camera.md +0 -30
  146. package/docs/plugins/jspsych-webgazer-validate.md +0 -44
  147. package/docs/plugins/list-of-plugins.md +0 -54
  148. package/docs/tutorials/hello-world.md +0 -162
  149. package/docs/tutorials/rt-task.md +0 -1334
  150. package/docs/tutorials/video-tutorials.md +0 -11
  151. package/examples/add-to-end-of-timeline.html +0 -38
  152. package/examples/case-sensitive-responses.html +0 -45
  153. package/examples/conditional-and-loop-functions.html +0 -64
  154. package/examples/css/jquery-ui.css +0 -1225
  155. package/examples/css-classes-parameter.html +0 -145
  156. package/examples/data-add-properties.html +0 -44
  157. package/examples/data-as-function.html +0 -39
  158. package/examples/data-from-timeline.html +0 -52
  159. package/examples/data-from-url.html +0 -21
  160. package/examples/demo-flanker.html +0 -117
  161. package/examples/demo-simple-rt-task.html +0 -120
  162. package/examples/demos/demo_1.html +0 -35
  163. package/examples/demos/demo_2.html +0 -50
  164. package/examples/demos/demo_3.html +0 -63
  165. package/examples/display-element-to-embed-experiment.html +0 -79
  166. package/examples/end-active-node.html +0 -52
  167. package/examples/end-experiment.html +0 -45
  168. package/examples/exclusions.html +0 -32
  169. package/examples/external_html/simple_consent.html +0 -4
  170. package/examples/img/1.gif +0 -0
  171. package/examples/img/10.gif +0 -0
  172. package/examples/img/11.gif +0 -0
  173. package/examples/img/12.gif +0 -0
  174. package/examples/img/2.gif +0 -0
  175. package/examples/img/3.gif +0 -0
  176. package/examples/img/4.gif +0 -0
  177. package/examples/img/5.gif +0 -0
  178. package/examples/img/6.gif +0 -0
  179. package/examples/img/7.gif +0 -0
  180. package/examples/img/8.gif +0 -0
  181. package/examples/img/9.gif +0 -0
  182. package/examples/img/age/of1.jpg +0 -0
  183. package/examples/img/age/of2.jpg +0 -0
  184. package/examples/img/age/of3.jpg +0 -0
  185. package/examples/img/age/om1.jpg +0 -0
  186. package/examples/img/age/om2.jpg +0 -0
  187. package/examples/img/age/om3.jpg +0 -0
  188. package/examples/img/age/yf1.jpg +0 -0
  189. package/examples/img/age/yf4.jpg +0 -0
  190. package/examples/img/age/yf5.jpg +0 -0
  191. package/examples/img/age/ym2.jpg +0 -0
  192. package/examples/img/age/ym3.jpg +0 -0
  193. package/examples/img/age/ym5.jpg +0 -0
  194. package/examples/img/backwardN.gif +0 -0
  195. package/examples/img/blue.png +0 -0
  196. package/examples/img/card.png +0 -0
  197. package/examples/img/con1.png +0 -0
  198. package/examples/img/con2.png +0 -0
  199. package/examples/img/fixation.gif +0 -0
  200. package/examples/img/happy_face_1.jpg +0 -0
  201. package/examples/img/happy_face_2.jpg +0 -0
  202. package/examples/img/happy_face_3.jpg +0 -0
  203. package/examples/img/happy_face_4.jpg +0 -0
  204. package/examples/img/inc1.png +0 -0
  205. package/examples/img/inc2.png +0 -0
  206. package/examples/img/normalN.gif +0 -0
  207. package/examples/img/orange.png +0 -0
  208. package/examples/img/redX.png +0 -0
  209. package/examples/img/ribbon.jpg +0 -0
  210. package/examples/img/sad_face_1.jpg +0 -0
  211. package/examples/img/sad_face_2.jpg +0 -0
  212. package/examples/img/sad_face_3.jpg +0 -0
  213. package/examples/img/sad_face_4.jpg +0 -0
  214. package/examples/js/snap.svg-min.js +0 -21
  215. package/examples/js/webgazer/ridgeWorker.mjs +0 -135
  216. package/examples/js/webgazer/webgazer.js +0 -88909
  217. package/examples/js/webgazer/worker_scripts/mat.js +0 -306
  218. package/examples/js/webgazer/worker_scripts/util.js +0 -398
  219. package/examples/jspsych-RDK.html +0 -58
  220. package/examples/jspsych-animation.html +0 -39
  221. package/examples/jspsych-audio-button-response.html +0 -58
  222. package/examples/jspsych-audio-keyboard-response.html +0 -68
  223. package/examples/jspsych-audio-slider-response.html +0 -61
  224. package/examples/jspsych-call-function.html +0 -32
  225. package/examples/jspsych-canvas-button-response.html +0 -95
  226. package/examples/jspsych-canvas-keyboard-response.html +0 -78
  227. package/examples/jspsych-canvas-slider-response.html +0 -67
  228. package/examples/jspsych-categorize-animation.html +0 -49
  229. package/examples/jspsych-categorize-html.html +0 -33
  230. package/examples/jspsych-categorize-image.html +0 -44
  231. package/examples/jspsych-cloze.html +0 -37
  232. package/examples/jspsych-free-sort.html +0 -109
  233. package/examples/jspsych-fullscreen.html +0 -45
  234. package/examples/jspsych-html-button-response.html +0 -43
  235. package/examples/jspsych-html-keyboard-response.html +0 -42
  236. package/examples/jspsych-html-slider-response.html +0 -53
  237. package/examples/jspsych-iat.html +0 -520
  238. package/examples/jspsych-image-button-response.html +0 -91
  239. package/examples/jspsych-image-keyboard-response.html +0 -85
  240. package/examples/jspsych-image-slider-response.html +0 -85
  241. package/examples/jspsych-instructions.html +0 -37
  242. package/examples/jspsych-maxdiff.html +0 -33
  243. package/examples/jspsych-preload.html +0 -140
  244. package/examples/jspsych-reconstruction.html +0 -43
  245. package/examples/jspsych-resize.html +0 -34
  246. package/examples/jspsych-same-different-html.html +0 -28
  247. package/examples/jspsych-same-different-image.html +0 -39
  248. package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
  249. package/examples/jspsych-serial-reaction-time.html +0 -54
  250. package/examples/jspsych-survey-html-form.html +0 -33
  251. package/examples/jspsych-survey-likert.html +0 -42
  252. package/examples/jspsych-survey-multi-choice.html +0 -40
  253. package/examples/jspsych-survey-multi-select.html +0 -42
  254. package/examples/jspsych-survey-text.html +0 -34
  255. package/examples/jspsych-video-button-response.html +0 -65
  256. package/examples/jspsych-video-keyboard-response.html +0 -61
  257. package/examples/jspsych-video-slider-response.html +0 -63
  258. package/examples/jspsych-virtual-chinrest.html +0 -69
  259. package/examples/jspsych-visual-search-circle.html +0 -64
  260. package/examples/jspsych-vsl-animate-occlusion.html +0 -35
  261. package/examples/jspsych-vsl-grid-scene.html +0 -47
  262. package/examples/lexical-decision.html +0 -134
  263. package/examples/manual-preloading.html +0 -59
  264. package/examples/pause-unpause.html +0 -33
  265. package/examples/progress-bar.html +0 -68
  266. package/examples/save-trial-parameters.html +0 -98
  267. package/examples/sound/hammer.mp3 +0 -0
  268. package/examples/sound/sound.mp3 +0 -0
  269. package/examples/sound/speech_blue.mp3 +0 -0
  270. package/examples/sound/speech_green.mp3 +0 -0
  271. package/examples/sound/speech_joke.mp3 +0 -0
  272. package/examples/sound/speech_red.mp3 +0 -0
  273. package/examples/sound/tone.mp3 +0 -0
  274. package/examples/timeline-variables-sampling.html +0 -50
  275. package/examples/timeline-variables.html +0 -64
  276. package/examples/video/sample_video.mp4 +0 -0
  277. package/examples/webgazer.html +0 -174
  278. package/examples/webgazer_audio.html +0 -90
  279. package/examples/webgazer_image.html +0 -60
  280. package/extensions/jspsych-ext-webgazer.js +0 -265
  281. package/jspsych.js +0 -3023
  282. package/license.txt +0 -21
  283. package/mkdocs.yml +0 -118
  284. package/plugins/jspsych-animation.js +0 -189
  285. package/plugins/jspsych-audio-button-response.js +0 -269
  286. package/plugins/jspsych-audio-keyboard-response.js +0 -209
  287. package/plugins/jspsych-audio-slider-response.js +0 -278
  288. package/plugins/jspsych-call-function.js +0 -58
  289. package/plugins/jspsych-canvas-button-response.js +0 -199
  290. package/plugins/jspsych-canvas-keyboard-response.js +0 -155
  291. package/plugins/jspsych-canvas-slider-response.js +0 -207
  292. package/plugins/jspsych-categorize-animation.js +0 -266
  293. package/plugins/jspsych-categorize-html.js +0 -220
  294. package/plugins/jspsych-categorize-image.js +0 -222
  295. package/plugins/jspsych-cloze.js +0 -112
  296. package/plugins/jspsych-external-html.js +0 -112
  297. package/plugins/jspsych-free-sort.js +0 -478
  298. package/plugins/jspsych-fullscreen.js +0 -106
  299. package/plugins/jspsych-html-button-response.js +0 -188
  300. package/plugins/jspsych-html-keyboard-response.js +0 -149
  301. package/plugins/jspsych-html-slider-response.js +0 -202
  302. package/plugins/jspsych-iat-html.js +0 -284
  303. package/plugins/jspsych-iat-image.js +0 -286
  304. package/plugins/jspsych-image-button-response.js +0 -327
  305. package/plugins/jspsych-image-keyboard-response.js +0 -263
  306. package/plugins/jspsych-image-slider-response.js +0 -369
  307. package/plugins/jspsych-instructions.js +0 -237
  308. package/plugins/jspsych-maxdiff.js +0 -173
  309. package/plugins/jspsych-preload.js +0 -345
  310. package/plugins/jspsych-rdk.js +0 -1373
  311. package/plugins/jspsych-reconstruction.js +0 -134
  312. package/plugins/jspsych-resize.js +0 -166
  313. package/plugins/jspsych-same-different-html.js +0 -168
  314. package/plugins/jspsych-same-different-image.js +0 -169
  315. package/plugins/jspsych-serial-reaction-time-mouse.js +0 -212
  316. package/plugins/jspsych-serial-reaction-time.js +0 -247
  317. package/plugins/jspsych-survey-html-form.js +0 -171
  318. package/plugins/jspsych-survey-likert.js +0 -195
  319. package/plugins/jspsych-survey-multi-choice.js +0 -208
  320. package/plugins/jspsych-survey-multi-select.js +0 -232
  321. package/plugins/jspsych-survey-text.js +0 -185
  322. package/plugins/jspsych-video-button-response.js +0 -335
  323. package/plugins/jspsych-video-keyboard-response.js +0 -279
  324. package/plugins/jspsych-video-slider-response.js +0 -351
  325. package/plugins/jspsych-virtual-chinrest.js +0 -471
  326. package/plugins/jspsych-visual-search-circle.js +0 -259
  327. package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
  328. package/plugins/jspsych-vsl-grid-scene.js +0 -103
  329. package/plugins/jspsych-webgazer-calibrate.js +0 -161
  330. package/plugins/jspsych-webgazer-init-camera.js +0 -139
  331. package/plugins/jspsych-webgazer-validate.js +0 -314
  332. package/plugins/template/jspsych-plugin-template.js +0 -35
  333. package/tests/README.md +0 -7
  334. package/tests/jsPsych/case-sensitive-responses.test.js +0 -53
  335. package/tests/jsPsych/css-classes-parameter.test.js +0 -107
  336. package/tests/jsPsych/default-iti.test.js +0 -51
  337. package/tests/jsPsych/default-parameters.test.js +0 -58
  338. package/tests/jsPsych/endexperiment.test.js +0 -49
  339. package/tests/jsPsych/events.test.js +0 -606
  340. package/tests/jsPsych/functions-as-parameters.test.js +0 -210
  341. package/tests/jsPsych/init.test.js +0 -48
  342. package/tests/jsPsych/loads.test.js +0 -7
  343. package/tests/jsPsych/min-rt.test.js +0 -58
  344. package/tests/jsPsych/progressbar.test.js +0 -202
  345. package/tests/jsPsych/timeline-variables.test.js +0 -531
  346. package/tests/jsPsych/timelines.test.js +0 -569
  347. package/tests/jsPsych.data/data-csv-conversion.test.js +0 -85
  348. package/tests/jsPsych.data/data-json-conversion.test.js +0 -120
  349. package/tests/jsPsych.data/datacollection.test.js +0 -117
  350. package/tests/jsPsych.data/datacolumn.test.js +0 -50
  351. package/tests/jsPsych.data/datamodule.test.js +0 -152
  352. package/tests/jsPsych.data/dataparameter.test.js +0 -251
  353. package/tests/jsPsych.data/interactions.test.js +0 -109
  354. package/tests/jsPsych.data/trialparameters.test.js +0 -175
  355. package/tests/jsPsych.extensions/extensions.test.js +0 -207
  356. package/tests/jsPsych.extensions/test-extension.js +0 -42
  357. package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -365
  358. package/tests/jsPsych.pluginAPI/preloads.test.js +0 -43
  359. package/tests/jsPsych.randomization/randomziation.test.js +0 -27
  360. package/tests/jsPsych.utils/utils.test.js +0 -58
  361. package/tests/plugins/plugin-animation.test.js +0 -34
  362. package/tests/plugins/plugin-audio-button-response.test.js +0 -15
  363. package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
  364. package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
  365. package/tests/plugins/plugin-call-function.test.js +0 -49
  366. package/tests/plugins/plugin-categorize-animation.test.js +0 -263
  367. package/tests/plugins/plugin-categorize-html.test.js +0 -17
  368. package/tests/plugins/plugin-categorize-image.test.js +0 -17
  369. package/tests/plugins/plugin-cloze.test.js +0 -157
  370. package/tests/plugins/plugin-free-sort.test.js +0 -106
  371. package/tests/plugins/plugin-fullscreen.test.js +0 -41
  372. package/tests/plugins/plugin-html-button-response.test.js +0 -161
  373. package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
  374. package/tests/plugins/plugin-html-slider-response.test.js +0 -155
  375. package/tests/plugins/plugin-iat-html.test.js +0 -299
  376. package/tests/plugins/plugin-iat-image.test.js +0 -298
  377. package/tests/plugins/plugin-image-button-response.test.js +0 -174
  378. package/tests/plugins/plugin-image-keyboard-response.test.js +0 -147
  379. package/tests/plugins/plugin-image-slider-response.test.js +0 -174
  380. package/tests/plugins/plugin-instructions.test.js +0 -85
  381. package/tests/plugins/plugin-maxdiff.test.js +0 -39
  382. package/tests/plugins/plugin-preload.test.js +0 -916
  383. package/tests/plugins/plugin-rdk.test.js +0 -61
  384. package/tests/plugins/plugin-reconstruction.test.js +0 -16
  385. package/tests/plugins/plugin-resize.test.js +0 -16
  386. package/tests/plugins/plugin-same-different-html.test.js +0 -17
  387. package/tests/plugins/plugin-same-different-image.test.js +0 -17
  388. package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
  389. package/tests/plugins/plugin-serial-reaction-time.test.js +0 -109
  390. package/tests/plugins/plugin-survey-html-form.test.js +0 -44
  391. package/tests/plugins/plugin-survey-likert.test.js +0 -48
  392. package/tests/plugins/plugin-survey-multi-choice.test.js +0 -47
  393. package/tests/plugins/plugin-survey-multi-select.test.js +0 -71
  394. package/tests/plugins/plugin-survey-text.test.js +0 -115
  395. package/tests/plugins/plugin-video-button-response.test.js +0 -32
  396. package/tests/plugins/plugin-video-keyboard-response.test.js +0 -32
  397. package/tests/plugins/plugin-video-slider-response.test.js +0 -31
  398. package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
  399. package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
  400. package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
  401. package/tests/testing-utils.js +0 -13
@@ -1,174 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
-
4
- <head>
5
- <script src="../jspsych.js"></script>
6
- <script src="../plugins/jspsych-html-keyboard-response.js"></script>
7
- <script src="../plugins/jspsych-html-button-response.js"></script>
8
- <script src="../plugins/jspsych-webgazer-init-camera.js"></script>
9
- <script src="../plugins/jspsych-webgazer-calibrate.js"></script>
10
- <script src="../plugins/jspsych-webgazer-validate.js"></script>
11
- <script src="js/webgazer/webgazer.js"></script>
12
- <script src="../extensions/jspsych-ext-webgazer.js"></script>
13
- <link rel="stylesheet" href="../css/jspsych.css">
14
- <style>
15
- .jspsych-content { max-width: 100%;}
16
- </style>
17
- </head>
18
-
19
- <body></body>
20
-
21
- <script>
22
-
23
- var camera_instructions = {
24
- type: 'html-button-response',
25
- stimulus: `
26
- <p>This experiment uses your camera for eye tracking.</p>
27
- <p>In order to participate you must allow the experiment to use your camera.</p>
28
- <p>You will be prompted to do this on the next screen.</p>
29
- <p>If you do not want to permit the experiment to use your camera, please close the page.</p>
30
- `,
31
- choices: ['Click to begin'],
32
- post_trial_gap: 1000
33
- }
34
-
35
- var init_camera = {
36
- type: 'webgazer-init-camera'
37
- }
38
-
39
- var calibration_instructions = {
40
- type: 'html-button-response',
41
- stimulus: `
42
- <p>Great! Now the eye tracker will be calibrated to translate the image of your eyes from the webcam to a location on your screen.</p>
43
- <p>To do this, you need to click a series of dots.</p>
44
- <p>Keep your head still, and click on each dot as it appears. Look at the dot as you click it.</p>
45
- `,
46
- choices: ['Click to begin'],
47
- post_trial_gap: 1000
48
- }
49
-
50
- var calibration = {
51
- type: 'webgazer-calibrate',
52
- calibration_points: [[50,50], [25,25], [25,75], [75,25], [75,75]],
53
- //calibration_points: [[10,10],[10,30],[10,50],[10,70],[10,90],[30,10],[30,30],[30,50],[30,70],[30,90],[50,10],[50,30],[50,50],[50,70],[50,90],[70,10],[70,30],[70,50],[70,70],[70,90],[90,10],[90,30],[90,50],[90,70],[90,90]],
54
- // calibration_points: [
55
- // [10,10],[10,50],[10,90],
56
- // [30,10],[30,50],[30,90],
57
- // [40,10],[40,30],[40,40],[40,45],[40,50],[40,55],[40,60],[40,70],[40,90],
58
- // [50,10],[50,30],[50,40],[50,45],[50,50],[50,55],[50,60],[50,70],[50,90],
59
- // [60,10],[60,30],[60,40],[60,45],[60,50],[60,55],[60,60],[60,70],[60,90],
60
- // [70,10],[70,50],[70,90],
61
- // [90,10],[90,50],[90,90]],
62
- repetitions_per_point: 3,
63
- randomize_calibration_order: true,
64
- }
65
-
66
- var validation_instructions = {
67
- type: 'html-button-response',
68
- stimulus: `
69
- <p>Let's see how accurate the eye tracking is. </p>
70
- <p>Keep your head still, and move your eyes to focus on each dot as it appears.</p>
71
- <p>You do not need to click on the dots. Just move your eyes to look at the dots.</p>
72
- `,
73
- choices: ['Click to begin'],
74
- post_trial_gap: 1000
75
- }
76
-
77
- var validation = {
78
- type: 'webgazer-validate',
79
- validation_points: [[25,25], [25,75], [75,25], [75,75]],
80
- show_validation_data: true
81
- }
82
-
83
- var task_instructions = {
84
- type: 'html-button-response',
85
- stimulus: `
86
- <p>We're ready for the task now.</p>
87
- <p>You'll see an arrow symbol (⬅ or ➡) appear on the screen.</p>
88
- <p>Your job is to press A if ⬅ appears, and L if ➡ appears.</p>
89
- <p>This will repeat 8 times.</p>
90
- `,
91
- choices: ['I am ready!'],
92
- post_trial_gap: 1000
93
- }
94
-
95
- var fixation = {
96
- type: 'html-keyboard-response',
97
- stimulus: '<p style="font-size:40px;">+</p>',
98
- choices: jsPsych.NO_KEYS,
99
- trial_duration: 500
100
- }
101
-
102
- var trial = {
103
- type: 'html-keyboard-response',
104
- stimulus: function () {
105
- return(
106
- `<div style="position: relative; width: 400px; height: 400px;">
107
- <div style="position: absolute; top:${jsPsych.timelineVariable('top', true)}%; left: ${jsPsych.timelineVariable('left', true)}%">
108
- <span id="arrow-target" style="font-size: 40px; transform: translate(-50%, -50%);">${jsPsych.timelineVariable('direction', true) == 'left' ? '⬅' : '➡'}</span>
109
- </div>
110
- </div>`
111
- )
112
- },
113
- choices: ['a', 'l'],
114
- post_trial_gap: 750,
115
- data: {
116
- top: jsPsych.timelineVariable('top'),
117
- left: jsPsych.timelineVariable('left')
118
- },
119
- extensions: [
120
- {type: 'webgazer', params: {targets: ['#arrow-target']}}
121
- ]
122
- }
123
-
124
- var params = [
125
- { left: 0, top: 0, direction: 'left' },
126
- { left: 100, top: 0, direction: 'left' },
127
- { left: 0, top: 100, direction: 'left' },
128
- { left: 100, top: 100, direction: 'left' },
129
- { left: 0, top: 0, direction: 'right' },
130
- { left: 100, top: 0, direction: 'right' },
131
- { left: 0, top: 100, direction: 'right' },
132
- { left: 100, top: 100, direction: 'right' },
133
- ]
134
-
135
- var trial_proc = {
136
- timeline: [fixation, trial],
137
- timeline_variables: params,
138
- randomize_order: true
139
- }
140
-
141
- var done = {
142
- type: 'html-button-response',
143
- choices: ['CSV', 'JSON'],
144
- stimulus: `<p>Done!</p><p>If you'd like to download a copy of the data to explore, click the format you'd like below</p>`,
145
- on_finish: function(data){
146
- if(data.response == 0){
147
- jsPsych.data.get().localSave('csv','webgazer-sample-data.csv');
148
- }
149
- if(data.response == 1){
150
- jsPsych.data.get().localSave('json', 'webgazer-sample-data.json');
151
- }
152
- }
153
- }
154
-
155
- var timeline = [];
156
- timeline.push(camera_instructions);
157
- timeline.push(init_camera);
158
- timeline.push(calibration_instructions);
159
- timeline.push(calibration);
160
- timeline.push(validation_instructions);
161
- timeline.push(validation);
162
- timeline.push(task_instructions);
163
- timeline.push(trial_proc);
164
- timeline.push(done);
165
-
166
- jsPsych.init({
167
- timeline: timeline,
168
- extensions: [
169
- {type: 'webgazer'}
170
- ]
171
- })
172
- </script>
173
-
174
- </html>
@@ -1,90 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <script src="../jspsych.js"></script>
5
- <script src="../plugins/jspsych-preload.js"></script>
6
- <script src="../plugins/jspsych-audio-keyboard-response.js"></script>
7
- <script src="../plugins/jspsych-html-keyboard-response.js"></script>
8
- <script src="../plugins/jspsych-webgazer-init-camera.js"></script>
9
- <script src="../plugins/jspsych-webgazer-calibrate.js"></script>
10
- <script src="../plugins/jspsych-webgazer-validate.js"></script>
11
- <script src="js/webgazer/webgazer.js"></script>
12
- <script src="../extensions/jspsych-ext-webgazer.js"></script>
13
- <link rel="stylesheet" href="../css/jspsych.css">
14
- <style>
15
- .jspsych-content { max-width: 100%;}
16
- </style>
17
- </head>
18
- <body></body>
19
- <script>
20
-
21
- var preload = {
22
- type: 'preload',
23
- images: ['img/blue.png', 'img/orange.png'],
24
- audio: ['sound/speech_blue.mp3']
25
- }
26
-
27
- var init_camera = {
28
- type: 'webgazer-init-camera'
29
- }
30
-
31
- var start_cal = {
32
- type: 'html-keyboard-response',
33
- stimulus: '<p>As each dot appears, look at it and then click on it.</p><p>Press a key to start.</p>'
34
- }
35
-
36
- var calibration = {
37
- type: 'webgazer-calibrate',
38
- calibration_points: [
39
- [25,25],[25,75],[50,50],[75,75],[75,25]
40
- ]
41
- }
42
-
43
- var start_val = {
44
- type: 'html-keyboard-response',
45
- stimulus: '<p>As each dot appears, look at it.</p><p>Press a key to start.</p>'
46
- }
47
-
48
- var validation = {
49
- type: 'webgazer-validate',
50
- validation_points: [
51
- [25,50],[75,50]
52
- ]
53
- }
54
-
55
- var start = {
56
- type: 'html-keyboard-response',
57
- stimulus: 'Look at the spoken color. Press a key to start.'
58
- }
59
-
60
- var trial = {
61
- type: 'audio-keyboard-response',
62
- stimulus: 'sound/speech_blue.mp3',
63
- prompt: `
64
- <div style="width:100vw; height:300px;">
65
- <img id="blue-target" style="float:left;" src="img/blue.png"></img>
66
- <img id="orange-target" style="float:right;" src="img/orange.png"></img>
67
- </div>
68
- `,
69
- choices: jsPsych.NO_KEYS,
70
- trial_duration: 2000,
71
- extensions: [
72
- {
73
- type: 'webgazer',
74
- params: {targets: ['#blue-target', '#orange-target']}
75
- }
76
- ]
77
- }
78
-
79
- jsPsych.init({
80
- timeline: [preload, init_camera, start_cal, calibration, start_val, validation, start, trial],
81
- extensions: [
82
- {type: 'webgazer'}
83
- ],
84
- on_finish: function() {
85
- jsPsych.data.displayData();
86
- }
87
- })
88
-
89
- </script>
90
- </html>
@@ -1,60 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <script src="../jspsych.js"></script>
5
- <script src="../plugins/jspsych-preload.js"></script>
6
- <script src="../plugins/jspsych-image-keyboard-response.js"></script>
7
- <script src="../plugins/jspsych-html-keyboard-response.js"></script>
8
- <script src="../plugins/jspsych-webgazer-init-camera.js"></script>
9
- <script src="../plugins/jspsych-webgazer-calibrate.js"></script>
10
- <script src="js/webgazer/webgazer.js"></script>
11
- <script src="../extensions/jspsych-ext-webgazer.js"></script>
12
- <link rel="stylesheet" href="../css/jspsych.css">
13
- </head>
14
- <body></body>
15
- <script>
16
-
17
- var preload = {
18
- type: 'preload',
19
- images: ['img/blue.png']
20
- }
21
-
22
- var init_camera = {
23
- type: 'webgazer-init-camera'
24
- }
25
-
26
- var validation = {
27
- type: 'webgazer-calibrate',
28
- }
29
-
30
- var start = {
31
- type: 'html-keyboard-response',
32
- stimulus: 'Press any key to start.'
33
- }
34
-
35
- var trial = {
36
- type: 'image-keyboard-response',
37
- stimulus: 'img/blue.png',
38
- render_on_canvas: false,
39
- choices: jsPsych.NO_KEYS,
40
- trial_duration: 1000,
41
- extensions: [
42
- {
43
- type: 'webgazer',
44
- params: {targets: ['#jspsych-image-keyboard-response-stimulus']}
45
- }
46
- ]
47
- }
48
-
49
- jsPsych.init({
50
- timeline: [preload, init_camera, validation, start, trial],
51
- extensions: [
52
- {type: 'webgazer'}
53
- ],
54
- on_finish: function() {
55
- jsPsych.data.displayData();
56
- }
57
- })
58
-
59
- </script>
60
- </html>
@@ -1,265 +0,0 @@
1
- jsPsych.extensions['webgazer'] = (function () {
2
-
3
- var extension = {};
4
-
5
- // private state for the extension
6
- // extension authors can define public functions to interact
7
- // with the state. recommend not exposing state directly
8
- // so that state manipulations are checked.
9
- var state = {};
10
-
11
- // required, will be called at jsPsych.init
12
- // should return a Promise
13
- extension.initialize = function (params) {
14
- // setting default values for params if not defined
15
- params.round_predictions = typeof params.round_predictions === 'undefined' ? true : params.round_predictions;
16
- params.auto_initialize = typeof params.auto_initialize === 'undefined' ? false : params.auto_initialize;
17
- params.sampling_interval = typeof params.sampling_interval === 'undefined' ? 34 : params.sampling_interval;
18
-
19
- return new Promise(function (resolve, reject) {
20
- if (typeof params.webgazer === 'undefined') {
21
- if (window.webgazer) {
22
- state.webgazer = window.webgazer;
23
- } else {
24
- reject(new Error('Webgazer extension failed to initialize. webgazer.js not loaded. Load webgazer.js before calling jsPsych.init()'));
25
- }
26
- } else {
27
- state.webgazer = params.webgazer;
28
- }
29
-
30
- // sets up event handler for webgazer data
31
- state.webgazer.setGazeListener(handleGazeDataUpdate);
32
-
33
- // default to threadedRidge regression
34
- // NEVER MIND... kalman filter is too useful.
35
- //state.webgazer.workerScriptURL = 'js/webgazer/ridgeWorker.mjs';
36
- //state.webgazer.setRegression('threadedRidge');
37
- //state.webgazer.applyKalmanFilter(false); // kalman filter doesn't seem to work yet with threadedridge.
38
-
39
- // set state parameters
40
- state.round_predictions = params.round_predictions;
41
- state.sampling_interval = params.sampling_interval;
42
-
43
- // sets state for initialization
44
- state.initialized = false;
45
- state.activeTrial = false;
46
- state.gazeUpdateCallbacks = [];
47
- state.domObserver = new MutationObserver(mutationObserverCallback);
48
-
49
- // hide video by default
50
- extension.hideVideo();
51
-
52
- // hide predictions by default
53
- extension.hidePredictions();
54
-
55
- if (params.auto_initialize) {
56
- // starts webgazer, and once it initializes we stop mouseCalibration and
57
- // pause webgazer data.
58
- state.webgazer.begin().then(function () {
59
- state.initialized = true;
60
- extension.stopMouseCalibration();
61
- extension.pause();
62
- resolve();
63
- }).catch(function (error) {
64
- console.error(error);
65
- reject(error);
66
- });
67
- } else {
68
- resolve();
69
- }
70
- })
71
- }
72
-
73
- // required, will be called when the trial starts (before trial loads)
74
- extension.on_start = function (params) {
75
- state.currentTrialData = [];
76
- state.currentTrialTargets = {};
77
- state.currentTrialSelectors = params.targets;
78
-
79
- state.domObserver.observe(jsPsych.getDisplayElement(), {childList: true})
80
-
81
- }
82
-
83
- // required will be called when the trial loads
84
- extension.on_load = function (params) {
85
-
86
- // set current trial start time
87
- state.currentTrialStart = performance.now();
88
-
89
- // resume data collection
90
- // state.webgazer.resume();
91
-
92
- extension.startSampleInterval();
93
-
94
- // set internal flag
95
- state.activeTrial = true;
96
- }
97
-
98
- // required, will be called when jsPsych.finishTrial() is called
99
- // must return data object to be merged into data.
100
- extension.on_finish = function (params) {
101
-
102
- // pause the eye tracker
103
- extension.stopSampleInterval();
104
-
105
- // stop watching the DOM
106
- state.domObserver.disconnect();
107
-
108
- // state.webgazer.pause();
109
-
110
- // set internal flag
111
- state.activeTrial = false;
112
-
113
- // send back the gazeData
114
- return {
115
- webgazer_data: state.currentTrialData,
116
- webgazer_targets: state.currentTrialTargets
117
- }
118
- }
119
-
120
- extension.start = function () {
121
- if(typeof state.webgazer == 'undefined'){
122
- console.error('Failed to start webgazer. Things to check: Is webgazer.js loaded? Is the webgazer extension included in jsPsych.init?')
123
- return;
124
- }
125
- return new Promise(function (resolve, reject) {
126
- state.webgazer.begin().then(function () {
127
- state.initialized = true;
128
- extension.stopMouseCalibration();
129
- extension.pause();
130
- resolve();
131
- }).catch(function (error) {
132
- console.error(error);
133
- reject(error);
134
- });
135
- });
136
- }
137
-
138
- extension.startSampleInterval = function(interval){
139
- interval = typeof interval == 'undefined' ? state.sampling_interval : interval;
140
- state.gazeInterval = setInterval(function(){
141
- state.webgazer.getCurrentPrediction().then(handleGazeDataUpdate);
142
- }, state.sampling_interval);
143
- // repeat the call here so that we get one immediate execution. above will not
144
- // start until state.sampling_interval is reached the first time.
145
- state.webgazer.getCurrentPrediction().then(handleGazeDataUpdate);
146
- }
147
-
148
- extension.stopSampleInterval = function(){
149
- clearInterval(state.gazeInterval);
150
- }
151
-
152
- extension.isInitialized = function(){
153
- return state.initialized;
154
- }
155
-
156
- extension.faceDetected = function () {
157
- return state.webgazer.getTracker().predictionReady;
158
- }
159
-
160
- extension.showPredictions = function () {
161
- state.webgazer.showPredictionPoints(true);
162
- }
163
-
164
- extension.hidePredictions = function () {
165
- state.webgazer.showPredictionPoints(false);
166
- }
167
-
168
- extension.showVideo = function () {
169
- state.webgazer.showVideo(true);
170
- state.webgazer.showFaceOverlay(true);
171
- state.webgazer.showFaceFeedbackBox(true);
172
- }
173
-
174
- extension.hideVideo = function () {
175
- state.webgazer.showVideo(false);
176
- state.webgazer.showFaceOverlay(false);
177
- state.webgazer.showFaceFeedbackBox(false);
178
- }
179
-
180
- extension.resume = function () {
181
- state.webgazer.resume();
182
- }
183
-
184
- extension.pause = function () {
185
- state.webgazer.pause();
186
- // sometimes gaze dot will show and freeze after pause?
187
- if(document.querySelector('#webgazerGazeDot')){
188
- document.querySelector('#webgazerGazeDot').style.display = 'none';
189
- }
190
- }
191
-
192
- extension.resetCalibration = function(){
193
- state.webgazer.clearData();
194
- }
195
-
196
- extension.stopMouseCalibration = function () {
197
- state.webgazer.removeMouseEventListeners()
198
- }
199
-
200
- extension.startMouseCalibration = function () {
201
- state.webgazer.addMouseEventListeners()
202
- }
203
-
204
- extension.calibratePoint = function (x, y) {
205
- state.webgazer.recordScreenPosition(x, y, 'click');
206
- }
207
-
208
- extension.setRegressionType = function (regression_type) {
209
- var valid_regression_models = ['ridge', 'weightedRidge', 'threadedRidge'];
210
- if (valid_regression_models.includes(regression_type)) {
211
- state.webgazer.setRegression(regression_type)
212
- } else {
213
- console.warn('Invalid regression_type parameter for webgazer.setRegressionType. Valid options are ridge, weightedRidge, and threadedRidge.')
214
- }
215
- }
216
-
217
- extension.getCurrentPrediction = function () {
218
- return state.webgazer.getCurrentPrediction();
219
- }
220
-
221
- extension.onGazeUpdate = function(callback){
222
- state.gazeUpdateCallbacks.push(callback);
223
- return function(){
224
- state.gazeUpdateCallbacks = state.gazeUpdateCallbacks.filter(function(item){
225
- return item !== callback;
226
- });
227
- }
228
- }
229
-
230
- function handleGazeDataUpdate(gazeData, elapsedTime) {
231
- if (gazeData !== null){
232
- var d = {
233
- x: state.round_predictions ? Math.round(gazeData.x) : gazeData.x,
234
- y: state.round_predictions ? Math.round(gazeData.y) : gazeData.y,
235
- t: gazeData.t
236
- }
237
- if(state.activeTrial) {
238
- //console.log(`handleUpdate: t = ${Math.round(gazeData.t)}, now = ${Math.round(performance.now())}`);
239
- d.t = Math.round(gazeData.t - state.currentTrialStart)
240
- state.currentTrialData.push(d); // add data to current trial's data
241
- }
242
- state.currentGaze = d;
243
- for(var i=0; i<state.gazeUpdateCallbacks.length; i++){
244
- state.gazeUpdateCallbacks[i](d);
245
- }
246
- } else {
247
- state.currentGaze = null;
248
- }
249
- }
250
-
251
- function mutationObserverCallback(mutationsList, observer){
252
- for(const selector of state.currentTrialSelectors){
253
- if(!state.currentTrialTargets[selector]){
254
- if(jsPsych.getDisplayElement().querySelector(selector)){
255
- var coords = jsPsych.getDisplayElement().querySelector(selector).getBoundingClientRect();
256
- state.currentTrialTargets[selector] = coords;
257
- }
258
- }
259
- }
260
- }
261
-
262
- return extension;
263
-
264
- })();
265
-