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,173 +0,0 @@
1
- /**
2
- * jspsych-maxdiff
3
- * Angus Hughes
4
- *
5
- * a jspsych plugin for maxdiff/conjoint analysis designs
6
- *
7
- */
8
-
9
- jsPsych.plugins['maxdiff'] = (function () {
10
-
11
- var plugin = {};
12
-
13
- plugin.info = {
14
- name: 'maxdiff',
15
- description: '',
16
- parameters: {
17
- alternatives: {
18
- type: jsPsych.plugins.parameterType.STRING,
19
- pretty_name: 'Alternatives',
20
- array: true,
21
- default: undefined,
22
- description: 'Alternatives presented in the maxdiff table.'
23
- },
24
- labels: {
25
- type: jsPsych.plugins.parameterType.STRING,
26
- array: true,
27
- pretty_name: 'Labels',
28
- default: undefined,
29
- description: 'Labels to display for left and right response columns.'
30
- },
31
- randomize_alternative_order: {
32
- type: jsPsych.plugins.parameterType.BOOL,
33
- pretty_name: 'Randomize Alternative Order',
34
- default: false,
35
- description: 'If true, the order of the alternatives will be randomized'
36
- },
37
- preamble: {
38
- type: jsPsych.plugins.parameterType.STRING,
39
- pretty_name: 'Preamble',
40
- default: '',
41
- description: 'String to display at top of the page.'
42
- },
43
- button_label: {
44
- type: jsPsych.plugins.parameterType.STRING,
45
- pretty_name: 'Button Label',
46
- default: 'Continue',
47
- description: 'Label of the button.'
48
- },
49
- required: {
50
- type: jsPsych.plugins.parameterType.BOOL,
51
- pretty_name: 'Required',
52
- default: false,
53
- description: 'Makes answering the alternative required.'
54
- }
55
- }
56
- }
57
-
58
- plugin.trial = function (display_element, trial) {
59
-
60
- var html = "";
61
- // inject CSS for trial
62
- html += '<style id="jspsych-maxdiff-css">';
63
- html += ".jspsych-maxdiff-statement {display:block; font-size: 16px; padding-top: 40px; margin-bottom:10px;}" +
64
- 'table.jspsych-maxdiff-table {border-collapse: collapse; padding: 15px; margin-left: auto; margin-right: auto;}' +
65
- 'table.jspsych-maxdiff-table td, th {border-bottom: 1px solid #dddddd; text-align: center; padding: 8px;}' +
66
- 'table.jspsych-maxdiff-table tr:nth-child(even) {background-color: #dddddd;}';
67
- html += '</style>';
68
-
69
- // show preamble text
70
- if (trial.preamble !== null) {
71
- html += '<div id="jspsych-maxdiff-preamble" class="jspsych-maxdiff-preamble">' + trial.preamble + '</div>';
72
- }
73
- html += '<form id="jspsych-maxdiff-form">';
74
-
75
- // add maxdiff options ///
76
- // first generate alternative order, randomized here as opposed to randomizing the order of alternatives
77
- // so that the data are always associated with the same alternative regardless of order.
78
- var alternative_order = [];
79
- for (var i = 0; i < trial.alternatives.length; i++) {
80
- alternative_order.push(i);
81
- }
82
- if (trial.randomize_alternative_order) {
83
- alternative_order = jsPsych.randomization.shuffle(alternative_order);
84
- }
85
-
86
- // Start with column headings
87
- var maxdiff_table = '<table class="jspsych-maxdiff-table"><tr><th id="jspsych-maxdiff-left-label">' + trial.labels[0] + '</th><th></th><th id="jspsych-maxdiff-right-label">' + trial.labels[1] + '</th></tr>';
88
-
89
- // construct each row of the maxdiff table
90
- for (var i = 0; i < trial.alternatives.length; i++) {
91
- var alternative = trial.alternatives[alternative_order[i]];
92
- // add alternative
93
- maxdiff_table += '<tr><td><input class= "jspsych-maxdiff-alt-' + i.toString() + '" type="radio" name="left" data-name = ' + alternative_order[i].toString() + ' /><br></td>';
94
- maxdiff_table += '<td id="jspsych-maxdiff-alternative-' + i.toString() + '">' + alternative + '</td>';
95
- maxdiff_table += '<td><input class= "jspsych-maxdiff-alt-' + i.toString() + '" type="radio" name="right" data-name = ' + alternative_order[i].toString() + ' /><br></td></tr>';
96
- }
97
- maxdiff_table += '</table><br><br>';
98
- html += maxdiff_table;
99
-
100
- // add submit button
101
- var enable_submit = trial.required == true ? 'disabled = "disabled"' : '';
102
- html += '<input type="submit" id="jspsych-maxdiff-next" class="jspsych-maxdiff jspsych-btn" ' + enable_submit + ' value="' + trial.button_label + '"></input>';
103
- html += '</form>';
104
-
105
- display_element.innerHTML = html;
106
-
107
- // function to control responses
108
- // first checks that the same alternative cannot be endorsed in the left and right columns simultaneously.
109
- // then enables the submit button if the trial is required.
110
- const left_right = ["left", "right"]
111
- left_right.forEach(function(p) {
112
- // Get all elements either 'left' or 'right'
113
- document.getElementsByName(p).forEach(function(alt) {
114
- alt.addEventListener('click', function() {
115
- // Find the opposite (if left, then right & vice versa) identified by the class (jspsych-maxdiff-alt-1, 2, etc)
116
- var op = alt.name == 'left' ? 'right' : 'left';
117
- var n = document.getElementsByClassName(alt.className).namedItem(op);
118
- // If it's checked, uncheck it.
119
- if (n.checked) {
120
- n.checked = false;
121
- }
122
-
123
- // check response
124
- if (trial.required){
125
- // Now check if one of both left and right have been enabled to allow submission
126
- var left_checked = [...document.getElementsByName('left')].some(c => c.checked);
127
- var right_checked = [...document.getElementsByName('right')].some(c => c.checked);
128
- if (left_checked && right_checked) {
129
- document.getElementById("jspsych-maxdiff-next").disabled = false;
130
- } else {
131
- document.getElementById("jspsych-maxdiff-next").disabled = true;
132
- }
133
- }
134
- });
135
- });
136
- });
137
-
138
- // Get the data once the submit button is clicked
139
- // Get the data once the submit button is clicked
140
- display_element.querySelector('#jspsych-maxdiff-form').addEventListener('submit', function(e){
141
- e.preventDefault();
142
-
143
- // measure response time
144
- var endTime = performance.now();
145
- var response_time = endTime - startTime;
146
-
147
- // get the alternative by the data-name attribute, allowing a null response if unchecked
148
- get_response = function(side){
149
- var col = display_element.querySelectorAll('[name=\"' + side + '\"]:checked')[0];
150
- if (col === undefined){
151
- return null;
152
- } else {
153
- var i = parseInt(col.getAttribute('data-name'));
154
- return trial.alternatives[i];
155
- }
156
- }
157
-
158
- // data saving
159
- var trial_data = {
160
- rt: response_time,
161
- labels: {left: trial.labels[0], right: trial.labels[1]},
162
- response: {left: get_response('left'), right: get_response('right')}
163
- };
164
-
165
- // next trial
166
- jsPsych.finishTrial(trial_data);
167
- });
168
-
169
- var startTime = performance.now();
170
- };
171
-
172
- return plugin;
173
- })();
@@ -1,345 +0,0 @@
1
- /**
2
- * jspsych-preload
3
- * documentation: docs.jspsych.org
4
- **/
5
-
6
- jsPsych.plugins['preload'] = (function() {
7
-
8
- var plugin = {};
9
-
10
- plugin.info = {
11
- name: 'preload',
12
- description: '',
13
- parameters: {
14
- auto_preload: {
15
- type: jsPsych.plugins.parameterType.BOOL,
16
- default: false,
17
- description: 'Whether or not to automatically preload any media files based on the timeline passed to jsPsych.init.'
18
- },
19
- trials: {
20
- type: jsPsych.plugins.parameterType.TIMELINE,
21
- default: [],
22
- description: 'Array with a timeline of trials to automatically preload. If one or more trial objects is provided, '+
23
- 'then the plugin will attempt to preload the media files used in the trial(s).'
24
- },
25
- images: {
26
- type: jsPsych.plugins.parameterType.STRING,
27
- default: [],
28
- description: 'Array with one or more image files to load. This parameter is often used in cases where media files cannot '+
29
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into an image plugin/parameter with '+
30
- 'timeline variables or dynamic parameters, or because the image is embedded in an HTML string.'
31
- },
32
- audio: {
33
- type: jsPsych.plugins.parameterType.STRING,
34
- default: [],
35
- description: 'Array with one or more audio files to load. This parameter is often used in cases where media files cannot '+
36
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into an audio plugin/parameter with '+
37
- 'timeline variables or dynamic parameters, or because the audio is embedded in an HTML string.'
38
- },
39
- video: {
40
- type: jsPsych.plugins.parameterType.STRING,
41
- default: [],
42
- description: 'Array with one or more video files to load. This parameter is often used in cases where media files cannot '+
43
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into a video plugin/parameter with '+
44
- 'timeline variables or dynamic parameters, or because the video is embedded in an HTML string.'
45
- },
46
- message: {
47
- type: jsPsych.plugins.parameterType.HTML_STRING,
48
- default: null,
49
- description: 'HTML-formatted message to be shown above the progress bar while the files are loading.'
50
- },
51
- show_progress_bar: {
52
- type: jsPsych.plugins.parameterType.BOOL,
53
- default: true,
54
- description: 'Whether or not to show the loading progress bar.'
55
- },
56
- continue_after_error: {
57
- type: jsPsych.plugins.parameterType.BOOL,
58
- default: false,
59
- description: 'Whether or not to continue with the experiment if a loading error occurs. If false, then if a loading error occurs, '+
60
- 'the error_message will be shown on the page and the trial will not end. If true, then if if a loading error occurs, the trial will end '+
61
- 'and preloading failure will be logged in the trial data.'
62
- },
63
- error_message: {
64
- type: jsPsych.plugins.parameterType.HTML_STRING,
65
- default: 'The experiment failed to load.',
66
- description: 'Error message to show on the page in case of any loading errors. This parameter is only relevant when continue_after_error is false.'
67
- },
68
- show_detailed_errors: {
69
- type: jsPsych.plugins.parameterType.BOOL,
70
- default: false,
71
- description: 'Whether or not to show a detailed error message on the page. If true, then detailed error messages will be shown on the '+
72
- 'page for all files that failed to load, along with the general error_message. This parameter is only relevant when continue_after_error is false.'
73
- },
74
- max_load_time: {
75
- type: jsPsych.plugins.parameterType.INT,
76
- default: null,
77
- description: 'The maximum amount of time that the plugin should wait before stopping the preload and either ending the trial '+
78
- '(if continue_after_error is true) or stopping the experiment with an error message (if continue_after_error is false). '+
79
- 'If null, the plugin will wait indefintely for the files to load.'
80
- },
81
- on_error: {
82
- type: jsPsych.plugins.parameterType.FUNCTION,
83
- default: null,
84
- description: 'Function to be called after a file fails to load. The function takes the file name as its only argument.'
85
- },
86
- on_success: {
87
- type: jsPsych.plugins.parameterType.FUNCTION,
88
- default: null,
89
- description: 'Function to be called after a file loads successfully. The function takes the file name as its only argument.'
90
- }
91
- }
92
- }
93
-
94
- plugin.trial = function(display_element, trial) {
95
-
96
- var success = null;
97
- var timeout = false;
98
- var failed_images = [];
99
- var failed_audio = [];
100
- var failed_video = [];
101
- var detailed_errors = [];
102
- var in_safe_mode = jsPsych.getSafeModeStatus();
103
-
104
- // create list of media to preload //
105
-
106
- var images = [];
107
- var audio = [];
108
- var video = [];
109
-
110
- if(trial.auto_preload){
111
- var auto_preload = jsPsych.pluginAPI.getAutoPreloadList();
112
- images = images.concat(auto_preload.images);
113
- audio = audio.concat(auto_preload.audio);
114
- video = video.concat(auto_preload.video);
115
- }
116
-
117
- if(trial.trials.length > 0){
118
- var trial_preloads = jsPsych.pluginAPI.getAutoPreloadList(trial.trials);
119
- images = images.concat(trial_preloads.images);
120
- audio = audio.concat(trial_preloads.audio);
121
- video = video.concat(trial_preloads.video);
122
- }
123
-
124
- images = images.concat(trial.images);
125
- audio = audio.concat(trial.audio);
126
- video = video.concat(trial.video);
127
-
128
- images = jsPsych.utils.unique(jsPsych.utils.flatten(images));
129
- audio = jsPsych.utils.unique(jsPsych.utils.flatten(audio));
130
- video = jsPsych.utils.unique(jsPsych.utils.flatten(video));
131
-
132
- if (in_safe_mode) {
133
- // don't preload video if in safe mode (experiment is running via file protocol)
134
- video = [];
135
- }
136
-
137
- // render display of message and progress bar
138
-
139
- var html = '';
140
-
141
- if(trial.message !== null){
142
- html += trial.message;
143
- }
144
-
145
- if(trial.show_progress_bar){
146
- html += `
147
- <div id='jspsych-loading-progress-bar-container' style='height: 10px; width: 300px; background-color: #ddd; margin: auto;'>
148
- <div id='jspsych-loading-progress-bar' style='height: 10px; width: 0%; background-color: #777;'></div>
149
- </div>`;
150
- }
151
-
152
- display_element.innerHTML = html;
153
-
154
- // do preloading
155
-
156
- if(trial.max_load_time !== null){
157
- jsPsych.pluginAPI.setTimeout(on_timeout, trial.max_load_time);
158
- }
159
-
160
- var total_n = images.length + audio.length + video.length;
161
- var loaded = 0; // success or error count
162
- var loaded_success = 0; // success count
163
-
164
- if (total_n == 0) {
165
- on_success();
166
- } else {
167
- function load_video(cb){
168
- jsPsych.pluginAPI.preloadVideo(video, cb, file_loading_success, file_loading_error);
169
- }
170
- function load_audio(cb){
171
- jsPsych.pluginAPI.preloadAudio(audio, cb, file_loading_success, file_loading_error);
172
- }
173
- function load_images(cb){
174
- jsPsych.pluginAPI.preloadImages(images, cb, file_loading_success, file_loading_error);
175
- }
176
- if (video.length > 0) { load_video(function () { }) }
177
- if (audio.length > 0) { load_audio(function () { }) }
178
- if (images.length > 0) { load_images(function () { }) }
179
- }
180
-
181
- // helper functions and callbacks
182
-
183
- function update_loading_progress_bar(){
184
- loaded++;
185
- if(trial.show_progress_bar){
186
- var percent_loaded = (loaded/total_n)*100;
187
- var preload_progress_bar = jsPsych.getDisplayElement().querySelector('#jspsych-loading-progress-bar');
188
- if (preload_progress_bar !== null) {
189
- preload_progress_bar.style.width = percent_loaded+"%";
190
- }
191
- }
192
- }
193
-
194
- // called when a single file loading fails
195
- function file_loading_error(e) {
196
- // update progress bar even if there's an error
197
- update_loading_progress_bar();
198
- // change success flag after first file loading error
199
- if (success == null) {
200
- success = false;
201
- }
202
- // add file to failed media list
203
- var source = "unknown file";
204
- if (e.source) {
205
- source = e.source;
206
- }
207
- if (e.error && e.error.path && e.error.path.length > 0) {
208
- if (e.error.path[0].localName == "img") {
209
- failed_images.push(source);
210
- } else if (e.error.path[0].localName == "audio") {
211
- failed_audio.push(source);
212
- } else if (e.error.path[0].localName == "video") {
213
- failed_video.push(source);
214
- }
215
- }
216
- // construct detailed error message
217
- var err_msg = '<p><strong>Error loading file: '+source+'</strong><br>';
218
- if (e.error.statusText) {
219
- err_msg += 'File request response status: '+e.error.statusText+'<br>';
220
- }
221
- if (e.error == "404") {
222
- err_msg += '404 - file not found.<br>';
223
- }
224
- if (typeof e.error.loaded !== 'undefined' && e.error.loaded !== null && e.error.loaded !== 0) {
225
- err_msg += e.error.loaded+' bytes transferred.';
226
- } else {
227
- err_msg += 'File did not begin loading. Check that file path is correct and reachable by the browser,<br>'+
228
- 'and that loading is not blocked by cross-origin resource sharing (CORS) errors.';
229
- }
230
- err_msg += '</p>';
231
- detailed_errors.push(err_msg);
232
- // call trial's on_error function
233
- after_error(source);
234
- // if this is the last file
235
- if (loaded == total_n) {
236
- if (trial.continue_after_error) {
237
- // if continue_after_error is false, then stop with an error
238
- end_trial();
239
- } else {
240
- // otherwise end the trial and continue
241
- stop_with_error_message();
242
- }
243
- }
244
- }
245
-
246
- // called when a single file loads successfully
247
- function file_loading_success(source) {
248
- update_loading_progress_bar();
249
- // call trial's on_success function
250
- after_success(source);
251
- loaded_success++;
252
- if (loaded_success == total_n) {
253
- // if this is the last file and all loaded successfully, call success function
254
- on_success();
255
- } else if (loaded == total_n) {
256
- // if this is the last file and there was at least one error
257
- if (trial.continue_after_error) {
258
- // end the trial and continue with experiment
259
- end_trial();
260
- } else {
261
- // if continue_after_error is false, then stop with an error
262
- stop_with_error_message();
263
- }
264
- }
265
- }
266
-
267
- // called if all files load successfully
268
- function on_success() {
269
- if (typeof timeout !== 'undefined' && timeout === false) {
270
- // clear timeout immediately after finishing, to handle race condition with max_load_time
271
- jsPsych.pluginAPI.clearAllTimeouts();
272
- // need to call cancel preload function to clear global jsPsych preload_request list, even when they've all succeeded
273
- jsPsych.pluginAPI.cancelPreloads();
274
- success = true;
275
- end_trial();
276
- }
277
- }
278
-
279
- // called if all_files haven't finished loading when max_load_time is reached
280
- function on_timeout() {
281
- //console.log('timeout fired');
282
- jsPsych.pluginAPI.cancelPreloads();
283
- if (typeof success !== 'undefined' && (success === false || success === null)) {
284
- timeout = true;
285
- if (loaded_success < total_n) {
286
- success = false;
287
- }
288
- after_error('timeout'); // call trial's on_error event handler here, in case loading timed out with no file errors
289
- detailed_errors.push('<p><strong>Loading timed out.</strong><br>'+
290
- 'Consider compressing your stimuli files, loading your files in smaller batches,<br>'+
291
- 'and/or increasing the <i>max_load_time</i> parameter.</p>');
292
- if (trial.continue_after_error) {
293
- end_trial();
294
- } else {
295
- stop_with_error_message();
296
- }
297
- }
298
- }
299
-
300
- function stop_with_error_message() {
301
- jsPsych.pluginAPI.clearAllTimeouts();
302
- jsPsych.pluginAPI.cancelPreloads();
303
- // show error message
304
- display_element.innerHTML = trial.error_message;
305
- // show detailed errors, if necessary
306
- if (trial.show_detailed_errors) {
307
- display_element.innerHTML += '<p><strong>Error details:</strong></p>';
308
- detailed_errors.forEach(function(e) {
309
- display_element.innerHTML += e;
310
- });
311
- }
312
- }
313
-
314
- function after_error(source) {
315
- // call on_error function and pass file name
316
- if (trial.on_error !== null) {
317
- trial.on_error(source);
318
- }
319
- }
320
- function after_success(source) {
321
- // call on_success function and pass file name
322
- if (trial.on_success !== null) {
323
- trial.on_success(source);
324
- }
325
- }
326
-
327
- function end_trial(){
328
- // clear timeout again when end_trial is called, to handle race condition with max_load_time
329
- jsPsych.pluginAPI.clearAllTimeouts();
330
- var trial_data = {
331
- success: success,
332
- timeout: timeout,
333
- failed_images: failed_images,
334
- failed_audio: failed_audio,
335
- failed_video: failed_video
336
- };
337
- // clear the display
338
- display_element.innerHTML = '';
339
- jsPsych.finishTrial(trial_data);
340
- }
341
- };
342
-
343
- return plugin;
344
- })();
345
-